0033と0034
あの後解いてた二問。
ちょっと気持ちの整理の問題もあったので日本語の問題に取り組んでみました。
0033
この問題は簡潔に言ってしまうと、数列から一つずつ数を取り出していったときに二つの昇順の数列に分けることができるかという問題。
方針としてはまぁ数列の要素数が10個なのでとりあえず探索。なにもなしに普通に探索でいけます。
bool solve(vector<int> data) { vector<int> B(1, 0), C(1, 0); int b=-1, c=-1; for (int i=0; i<10; i++) { if (b == -1) { B[0] = data[i]; b++; } else if (B[b] > data[i]) { if (c == -1) { C[0] = data[i]; c++; } else if (C[c] < data[i]) { C.push_back(data[i]); c++; } else { return false; } } else { B.push_back(data[i]); b++; } } return true; } int main() { int N; cin >> N; vector<int> data(10); bool b; for (int i=0; i<N; i++) { cin >> data[0] >> data[1] >> data[2] >> data[3] >> data[4] >> data[5] >> data[6] >> data[7] >> data[8] >> data[9]; b = solve(data); if (b) { cout << "YES" << endl; } else { cout << "NO" << endl; } } }
まぁコッチは普通に。
0034
ちょっと手こずりました。
実行時間オーバーとかは、まぁscanfで改行のみの入力になったらやめるとかいうループの判定方法調べてできたけど・・・
最終的に間違いの原因だったのは初期化の問題だったorz
というわけでコード
int main() { int v1,v2,ret; double sum=0; vector<int> l(10, 0); while (scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &l[0],&l[1],&l[2],&l[3],&l[4],&l[5],&l[6],&l[7],&l[8],&l[9],&v1,&v2) != EOF) { sum = 0; for (int i=0; i<10; i++) { sum += l[i]; } sum /= (v1+v2); sum *= v1; for (int i=0; i<10; i++) { sum -= l[i]; if (sum <= 0) { ret = i+1; break; } } cout << ret << endl; } return 0; }
次の記事はSRM154れす(笑)