王の名前と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; }
与えられた手順があるので、停止するかどうかと停止したときの変数の値を求める問題。
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; }