夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

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れす(笑)