TopCoder Member SRM 501 DIV2

Rating: 843(灰)→944(緑)

やった!緑に復帰やっとできた!
やっと、とはいえ、一番最初の元の緑はマグレなので、やっとそれなりに実力がついてきたかなという感じ。

259.27 Points

250: FoxProgression

純粋に等差数列と等比数列の判定を2つの関数に分けていて、当初それぞれの結果が同一になる(== 1つとしてカウントされる)状態を想定しておらず、あわてて少ない修正でそれらを判定すべく関数にnextとかいう汚い逆参照くっつけた。のでこんなコードになってます。

209.27 Points

#include <iostream>
#include <sstream>

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

class FoxProgression {
public:
	int canBeArithmetic(vector<int>& seq, int& next){
		int x = seq[1] - seq[0];
		if(x == 0) return 0;
		for(int i = 1; i < seq.size() - 1; i++){
			int t = seq[i + 1] - seq[i];
			if(t != x) return 0;
		}
		next = seq[seq.size() - 1] + x;
		return 1;
	}
	int canBeGeometric(vector<int>& seq, int& next){
		if(seq[1] % seq[0]) return 0;
		int x = seq[1] / seq[0];
		for(int i = 1; i < seq.size() - 1; i++){
			if(seq[i + 1] % seq[i]) return 0;
			int t = seq[i + 1] / seq[i];
			if(t != x) return 0;
		}
		next = seq[seq.size() - 1] * x;
		return 1;
	}
	int theCount(vector <int> seq) {
		if(seq.size() <= 1) return -1;
		int nx, ny;
		int res = canBeArithmetic(seq, nx) + canBeGeometric(seq, ny);
		if(res == 2 && nx == ny) res -= 1;
		return res;
	}
	

};

500: FoxPlayingGame

わからなかった。分数クラスを作ってそれで幅優先探索するコードは書けたが、DPに持ち込めなかった。DPだとは分かっていたが…
そもそも分数クラスとかは求められていないという説も。

1000:

Unopened