Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2012-01-15

SRM 529 Div2

11:24 | SRM 529 Div2 - kojingharangの日記 を含むブックマーク はてなブックマーク - SRM 529 Div2 - kojingharangの日記 SRM 529 Div2 - kojingharangの日記 のブックマークコメント

237.78 WA opend 1152->1086

引き続き暴落中... そろそろ上がりたく。

SMR 529 Div2 medium KingSort

11:24 |  SMR 529 Div2 medium KingSort - kojingharangの日記 を含むブックマーク はてなブックマーク -  SMR 529 Div2 medium KingSort - kojingharangの日記  SMR 529 Div2 medium KingSort - kojingharangの日記 のブックマークコメント

王の名前とN世が文字列で与えられるので、王の名前とローマ数字の昇順にソートして返す問題。

ローマ数字→intのルーチンで一桁目が 0 の場合に何も返してなくて failed system test. ぬるい。

手元のコンパイルのとき -Wall くらい付けたほうがいいな。

(あとで通したもの)

class KingSort {
	public:
	int ord(string s) {
		//The Roman numerals for 1 through 10 are I, II, III, IV, V, VI, VII, VIII, IX, and X.
		//The Roman numerals for 20, 30, 40, and 50 are XX, XXX, XL, and L.
		if(s.substr(0,1)=="L") return 50+ord(s.substr(1));
		if(s.substr(0,2)=="XL") return 40+ord(s.substr(2));
		if(s.substr(0,3)=="XXX") return 30+ord(s.substr(3));
		if(s.substr(0,2)=="XX") return 20+ord(s.substr(2));
		if(s.substr(0,1)=="X") return 10+ord(s.substr(1));
		if(s.substr(0,2)=="IX") return 9;
		if(s.substr(0,4)=="VIII") return 8;
		if(s.substr(0,3)=="VII") return 7;
		if(s.substr(0,2)=="VI") return 6;
		if(s.substr(0,1)=="V") return 5;
		if(s.substr(0,2)=="IV") return 4;
		if(s.substr(0,3)=="III") return 3;
		if(s.substr(0,2)=="II") return 2;
		if(s.substr(0,1)=="I") return 1;
		return 0;  // <- これ!
	}
	vector <string> getSortedList(vector <string> kings) {
		vector<pair<pair<string, int>, string> > w;
		REP(i, kings.size()) {
			stringstream ss(kings[i]);
			string name, o;
			ss>>name>>o;
			w.push_back(make_pair(make_pair(name, ord(o)), kings[i]));
		}
		sort(ALL(w));
		vector<string> ans(w.size());
		REP(i, w.size()) ans[i]=w[i].second;
		return ans;
	}

SMR 529 Div2 hard MinskyMysteryDiv2

11:24 |  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記 を含むブックマーク はてなブックマーク -  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記  SMR 529 Div2 hard MinskyMysteryDiv2 - kojingharangの日記 のブックマークコメント

与えられた手順があるので、停止するかどうかと停止したときの変数の値を求める問題。

40分くらい紙の上で考えたけど最適化できず。あとから考えるとコードを動かしながら考えれば良かった。。

(あとで)

bag0 bag1の大小で分けると、bag0 < bag1なら停止しない、そうでなければ bag0%bag1==0なら停止して bag1+bag0/bag1 が答え。

割り切れない場合は、bag0=bag2 のとこで実際にいくつか出力してみると bag0 は元々の bag0 と同じになりそうということがわかったので

bag2 関連は無視してよくて(ここがポイントっぽい)、bag1 は 1 ずつ増えて行って bag0==bag1 になったら bag0%bag1==0 になるので停止するので bag0%bag1 != 0 の場合もいずれ停止する。

というわけで N<2 なら -1, そうでなければ N の最初の約数 i に対して i+N/i を返せばよい。

O(sqrt(N)) なので 10^12 でもOK.

(あとで通したもの)

class MinskyMysteryDiv2 {
	public:
	long long computeAnswer(long long N) {
		if(N<2) return -1;
		if(N%2==0) return 2+N/2;
		for(ll i=3;i*i<=N;i+=2) {
			if(N%i==0) return i+N/i;
		}
		return N+1;
	}
 |