Codeforces Round #102(Div.2)
結果
ooox- +0 2514pts(90th)
1552 -> 1661(+109)
Div.1まであと39! & Highest更新
問題
A
1 <= a,b,c,d <= 9 なので全探索すればよし。
あとはすべて異なる整数であることを忘れずに。
(ソースがとても汚い)
int main(){ int r1,r2,c1,c2,d1,d2; cin >> r1 >> r2 >> c1 >> c2 >> d1 >> d2; for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ for(int k=1;k<=9;k++){ for(int l=1;l<=9;l++){ if(i + j == r1 && k + l == r2 && i + k == c1 && j + l == c2 && i + l == d1 && j + k == d2 && i != j && i != k && i != l && j != k && j != l && k != l){ cout << i << " " << j << endl; cout << k << " " << l << endl; return 0; } } } } } cout << -1 << endl; return 0; }
B
実装ゲー。3桁区切りのコンマは下の位から作ってreverseするようにした.
int main(){ string str; cin >> str; bool minus = false; bool dot = false; int flac_cnt = 0; vector<char> digit; string digit_res = ""; vector<char> flac; for(int i=0;i<str.size();i++){ if(str[i] == '-'){ minus = true; }else if(str[i] == '.'){ dot = true; }else if(dot == false){ digit.push_back(str[i]); }else if(flac_cnt < 2){ flac.push_back(str[i]); flac_cnt++; } } for(int i=0;i<digit.size();i++){ digit_res += digit[digit.size() - 1 - i]; if(i % 3 == 2 && i != digit.size() - 1){ digit_res += ","; } } reverse(digit_res.begin(), digit_res.end()); if(minus){ cout << "("; } cout << "$"; cout << digit_res; cout << "."; if(flac.size() == 0){ cout << "00"; }else if(flac.size() == 1){ cout << flac[0] << "0"; }else{ cout << flac[0] << flac[1]; } if(minus){ cout << ")"; } cout << endl; return 0; }
C
n = a*b*cと表せるとき
mini = min((a+2)*(b+2)*(c+1), (a+2)*(b+1)*(c+2), (a+1)*(b+2)*(c+2)) - n; maxi = max((a+2)*(b+2)*(c+1), (a+2)*(b+1)*(c+2), (a+1)*(b+2)*(c+2)) - n;
を計算すればよい。a,b,c,の組み合わせは
curt()を立方根としてa=b=c=curt(n)まで調べればよく、bはsqrt(n/a)まで調べればよく、cはn/(a*b)が割りきれれば求まるので結果としてo(curt(n)*sqrt(n))ですべてのa,b,cの組を列挙できる。
誤差か初期化ミスか解らないけど1回Pretestで落ちた。
int main(){ ll n; ll cbrt; ll mini = 8e+18; ll maxi = -1; cin >> n; for(ll i=0;i*i*i <= n; i++){ cbrt = i; } for(ll i=1;i<=cbrt;i++){ for(ll j=i;j<=sqrt(((double)n + 1e-7)/i + 1e-7);j++){ if(n % (i*j) == 0){ ll k = n / (i*j); printf("i = %lld, j = %lld, k = %lld\n",i,j,k); mini = min(mini, (i+2) * (j+2) * (k+1) - n); maxi = max(maxi, (i+2) * (j+2) * (k+1) - n); mini = min(mini, (i+2) * (j+1) * (k+2) - n); maxi = max(maxi, (i+2) * (j+1) * (k+2) - n); mini = min(mini, (i+1) * (j+2) * (k+2) - n); maxi = max(maxi, (i+1) * (j+2) * (k+2) - n); } } } cout << mini << " " << maxi << endl; }
D
1回hackされて、System testで落ちた。桂馬飛びの位置に置いてはいけない、というのはすぐ解った。
(ChessだとKnightなんですね)
基本市松模様に配置すれば良いはずで、1列の時は全部置ける→hacked
ああ、2*2の時は全部置けるのか→Failed System Test
2*5の時には
■■□□■ ■■□□■
で6個置けるんですね…2*2に気づいたならこれも考えたかったですね。
感想
次回落ちる気しかしないけどがんばりたい。