codeforces #157 div2
こどふぉ初参加でした
ABCの3完
1516(青)だった。
codeforcesのルールがよく分からない。
1500以上だとdiv1?
A
各行が黒白互い違いになっていればYES,そうでないならNO
#include <cstdio> using namespace std; char a[8][8]; int main(){ char c; bool f = true; for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ scanf("%c", &a[i][j]); if(j!=0) if(a[i][j] == a[i][j-1]) f = false; } if(!f){ puts("NO"); return 0; } scanf("%c", &c); } puts("YES"); return 0; }
B
1から100000まで全探索して魔方陣が成立するか判定
#include <cstdio> using namespace std; int a[3][3]; bool is_ok(int k){ if(k != a[0][0] + a[1][1] + a[2][2] || k != a[0][2] + a[1][1] + a[2][0]) return false; for(int i = 0; i < 3; i++){ int t = 0; for(int j = 0; j < 3; j++) t += a[i][j]; if(k != t) return false; } return true; } int main(){ for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) scanf("%d", &a[i][j]); for(int i = 1; i <= 100000; i++){ int k = i + a[1][0] + a[2][0]; a[0][0] = i; a[1][1] = k - (a[0][1] + a[2][1]); a[2][2] = k - (a[0][2] + a[1][2]); if(a[1][1] < 1 || a[2][2] < 1) continue; if(is_ok(k)){ for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++) printf("%d ", a[i][j]); puts(""); } return 0; } } return 0; }
C
基本的には貪欲法で一番上の桁にある0を一つ消せばよい。
ただし、すべての桁が1のとき、1を一つ消すのを忘れないようにする。
これを忘れていて、1回hackされた
#include <string> #include <iostream> using namespace std; string d; int main(){ cin >> d; bool f = true; for(int i = 0; i < d.size(); i++){ if(f && d[i] == '1' && i == d.size() - 1){ break; }else if(f && d[i] == '0'){ f = false; }else{ cout << d[i]; } } cout << endl; return 0; }