CodeFoces Round294 Div2
結果:2完
レーティング:1257→1198(-59)
灰コーダーに落ちてしまいました(泣)
今回はA,B問題をACして2完でした(時間がかかりすぎたのが悪かったな)
Problem A "A and B and Chess"
チェスの駒ごとに重さ(価値?)が決まっていて、白・黒の各プレイヤー毎の合計の重さが重い方を出力する問題。
ボードが8x8なので左上から右下にループを回して、大文字なら白の重さに追加して、小文字なら黒の重さに追加していき、最終的に重い方のプレイヤーを出力・または引き分けを出力して終わり。
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int,int> pint; #define rep(i,n) for(int i=0;i<(int)(n);i++) const int INF = 100000000; const int dx[4]={0,1,0,-1}, dy[4]={-1,0,1,0}; struct P{int x;int y;P(int X=0,int Y=0){x=X;y=Y;}}; int main() { char bd[9][9]; rep(i,8) cin >> bd[i]; int white = 0; int black = 0; rep(i,8) rep(j,8) { int p = 0; if(bd[i][j] == 'Q' || bd[i][j] == 'q') p = 9; if(bd[i][j] == 'R' || bd[i][j] == 'r') p = 5; if(bd[i][j] == 'B' || bd[i][j] == 'b') p = 3; if(bd[i][j] == 'N' || bd[i][j] == 'n') p = 3; if(bd[i][j] == 'P' || bd[i][j] == 'p') p = 1; if(bd[i][j] >= 'a' && bd[i][j] <= 'z') black += p; if(bd[i][j] >= 'A' && bd[i][j] <= 'Z') white += p; } if(white > black) printf("White\n"); if(white < black) printf("Black\n"); if(white == black) printf("Draw\n"); return 0; }
Problem B " A and B and Compilation Errors"
はじめにすべてのコンパイルエラーが渡され、Bさんが1回目の修正を行った後のエラー、Bさんが2回目の修正を行った後のエラーの3つの数字の列が与えられるとき、
Bさんが1回目の修正で直したエラーの番号と、2回目の修正で直したエラーの番号を出力する問題。
与えられる数字の列を数列1・数列2・数列3とおくと、数列1→数列2でどの数が消えたか、数列2→数列3でどの数が消えたかを求めます。
しばらく考えていたら、各数列の合計値の差を取れば良いことに気が付きました。この解法はかなり簡単に実装できます。
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int,int> pint; #define rep(i,n) for(int i=0;i<(int)(n);i++) const int INF = 100000000; const int dx[4]={0,1,0,-1}, dy[4]={-1,0,1,0}; struct P{int x;int y;P(int X=0,int Y=0){x=X;y=Y;}}; int main() { int f,s; int n; cin >> n; int sum = 0; int sum2 = 0; int sum3 = 0; rep(i,n) { int a; cin >> a; sum += a; } rep(i,n-1) { int a; cin >> a; sum2 += a; } rep(i,n-2) { int a; cin >> a; sum3 += a; } f = sum - sum2; s = sum2 - sum3; cout << f << endl; cout << s << endl; return 0; }
C以降はまだ解いていません。
それでは。