標籤:acm codeforces
題目傳送:Codeforces Round #300
A. Cutting Banner
思路:一看題就會錯意了,然後一頓猛敲,果不其然的被hack了,然後才發現只需要剪中間那一段就可以了,然後又傻逼得少寫一個等號,還是被hack了,心累啊
AC代碼:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;char s[105];char tmp[15] = "CODEFORCES";int len;int fun(int x) {char t[105];strcpy(t, s);for(int i = x; i < 10; i++) {t[i] = s[i + len - 10];}t[10] = '\0';//printf("%s\n", t);if(strcmp(t, tmp) == 0) return 1;return 0;}int main() {scanf("%s", s);len = strlen(s);if(len < 10) {printf("NO\n");return 0;}int flag = 0;for(int i = 0; i <= 10; i++) {if(fun(i)) {flag = 1;break;}}if(flag) {printf("YES\n");}else printf("NO\n");return 0;}
B. Quasi Binary
思路:先判斷出每位元上的最大值,然後再輸出就好了
AC代碼:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;int n;int a[8];int ma;void fun(int x) {ma = 0;memset(a, 0, sizeof(a));int sum = 1;while(x) {a[sum] = x % 10;if(a[sum] > ma) {ma = a[sum];}x /= 10;sum ++;}}int main() {scanf("%d", &n);fun(n);printf("%d\n", ma);for(int i = 0; i < ma - 1; i++, printf(" ")) {int flag = 0;for(int j = 7; j >= 1; j--) {if(flag) {if(a[j] > 0) {printf("1");a[j] --;}else printf("0");}else if(a[j] > 0) {flag = 1;a[j] --;printf("1");}}}int flag = 0;for(int j = 7; j >= 1; j--) {if(flag) {if(a[j] > 0) {printf("1");a[j] --;}else printf("0");}else if(a[j] > 0) {flag = 1;a[j] --;printf("1");}}printf("\n");return 0;}
C. Tourist‘s Notes
思路:也是一個簡單題,但是沒注意到兩邊錯了。。。
AC代碼:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;int main() {int n, m;scanf("%d %d", &n, &m);int pred = 0, preh = 0;int ans = 0;for(int i = 0; i < m; i ++) {int d, h;scanf("%d %d", &d, &h);if(i == 0) ans = h + d - 1;else {if(abs(preh - h) > abs(pred - d)) {printf("IMPOSSIBLE\n");return 0;}else {ans = max(ans, (preh + h + abs(pred - d) ) / 2);}}preh = h;pred = d;}ans = max(ans, preh + (n - pred));printf("%d\n", ans);return 0;}
D. Weird Chess
原來可以很多組解,唉,就當我會錯意了吧,英語不好好難受
題意:給你一個棋盤,o為棋子,x為可以攻擊到的,讓你輸出棋子的攻擊範圍
思路:先初始化整個棋盤為都可以攻擊到的,即全賦值為x,然後在遍曆整個給出的圖,找不能攻擊到的相對位置,順著推出棋子能夠攻擊到的位置,即確定好了棋子的攻擊範圍,然後在逆推,找可以攻擊到的位置,再與棋子的攻擊範圍相對照即可
AC代碼:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <deque>#include <cctype>#define LL long long#define INF 0x7fffffffusing namespace std;int n;string s[60];string ans[110];void print() {for(int i = 0; i < 2 * n + 1; i ++) {cout << ans[i] << endl;}}int main() {scanf("%d", &n);for(int i = 0; i < n; i++) {cin >> s[i];}for(int i = 0; i < 2 * n - 1; i ++) {for(int j = 0; j < 2 * n - 1; j ++) {ans[i] += 'x';//先假設全部都能攻擊到 }}ans[n - 1][n - 1] = 'o';//print();for(int i = 0; i < n; i ++) {for(int j = 0; j < n; j ++) {if(s[i][j] == 'o') {for(int k = 0; k < n; k ++) {for(int l = 0; l < n; l ++) {if(s[k][l] == '.') {ans[k-i+n-1][l-j+n-1] = '.';//把當前不能攻擊到的相對位置記錄下來 }}}}}}for(int i = 0; i < n; i ++) {for(int j = 0; j < n; j ++) {if(s[i][j] == 'x') {//找到當前能被攻擊到的點 bool find = false;for(int k = 0; k < n; k ++) {for(int l = 0; l < n; l ++) {//找相對位置的棋子,看棋盤上也是否可以攻擊到 if(s[k][l] == 'o' && ans[i-k+n-1][j-l+n-1] == 'x') find = true;}}if(!find) {cout << "NO" << endl;return 0;}}}}cout << "YES" << endl;for(int i = 0; i < 2 * n - 1; i ++) {cout << ans[i] << endl;//printf("%s\n", ans[i].c_str());}return 0;}
Codeforces Round #300 (A,B,C,D)