TopCoder SRM 498 DIV2

Rating: 883→894(灰)
400.41 Points

とりあえず上がったので良かった。
全体としては、コーディング速度の壁に一つブチ当たったような気もする。

250: AdditionGame

実装に迷ってしまって、最初vector→めんどい→set→「あ、違ぇや」などの流れを踏んだ結果、非常に遅いSubmitになってしまった。反省。

227.05 Points

#include <queue>
using namespace std;

class AdditionGame {
public:
	int getMaximumPoints(int A, int B, int C, int N) {
		priority_queue<int> pq;
		pq.push(A);
		pq.push(B);
		pq.push(C);
		int point = 0;
		for(int i = 0; i < N; i++){
			int cur = pq.top(); pq.pop();
			point += cur;
			pq.push(cur + (cur >= 1 ? -1 : 0));
		}
		return point;
	}

};

500: FoxSequence

全く褒められない解答。やる事は非常に単純であるので、きれいに書けるかどうかで真価が問われる問題だと思う。
これもresubmitで大きく点を下げている。が、それのおかげでとりあえず通ったのでまあ…。

173.36 Points

#include <string>
#include <vector>
using namespace std;

#define NO string("NO")
#define YES string("YES")

class FoxSequence {
public:
	string isValid(vector <int> seq) {
		if(seq.size() < 5) return NO;
		int p = 0;
		//1 2 1 2 1
		// increase
		int m = seq[p + 1] - seq[p];
		if (m <= 0) return NO;
		for(p++; p < seq.size() - 1; ){
			int md = seq[p + 1] - seq[p];
			if(md != m){
				if(md > 0) return NO;
				break;
			}
			p++;
		}
		if(seq.size() - p < 4) return NO;

		// decrease
		m = seq[p + 1] - seq[p];
		if(m >= 0) return NO;
		for(p++; p < seq.size() - 1; ){
			int md = seq[p + 1] - seq[p];
			if(md != m) break;
			p++;
		}
		if(seq.size() - p < 3) return NO;

		// equal
		if((m = seq[p + 1] - seq[p]) == 0){
			for(p++; p < seq.size() - 1; ){
				int md = seq[p + 1] - seq[p];
				if(md != m){
					break;
				}
				p++;
			}
		}

		if(seq.size() - p < 2) return NO;

		// increase
		m = seq[p + 1] - seq[p];
		if (m <= 0) return NO;
		for(p++; p < seq.size() - 1; ){
			int md = seq[p + 1] - seq[p];
			if(md != m){
				if(md > 0) return NO;
				break;
			}
			p++;
		}

		if(seq.size() - p - 1 < 1) return NO;

		// decrease
		m = seq[p + 1] - seq[p];
		if (m >= 0) return NO;
		for(p++; p < seq.size() - 1; ){
			int md = seq[p + 1] - seq[p];
			if(md != m) return NO;
			p++;
		}

		return YES;
	}
};