夢追い人

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

SRM520

Medium落ちて500位台
やばい・・・(;・∀・)

レートは824->828

Easy

SRM参加者のレートが与えられる。ratings[0]があなたのレートである。部屋がK部屋あり、レートの高い順に均等に振り分けられると考えたとき、あなたと同じ部屋であなたよりレートの高い人の人数を求める問題。

解法

pairで管理してソートし、自分のレートのソート列内でのポジションを調べ、そこからKの倍数分ずらした人はすべて同じ部屋だからその中で自分のレートより高い人を数える。
だけど、他人のコードで気づいたけど、自分のレートより高い人の人数をKで割るだけで普通に答えでたorz

class SRMRoomAssignmentPhase {
public:
   int countCompetitors( vector <int> ratings, int K ) {
		int sz = ratings.size();
		vector<pii> maps(sz);
		for (int i=0; i<sz; i++) {
			maps[i].first = ratings[i];
			maps[i].second = i;
		}
		sort(maps.begin(), maps.end());
		int rpos;
		for (int i=0; i<sz; i++) if (maps[i].second==0) {
			rpos=i;
			break;
		}
		int res = 0;
		for (int i=rpos+K; i<sz; i+=K) res++;
		return res;
   }
};

Medium

Easy,Medium,Hard,の得点と、それぞれを自分がどれくらいの時間で解けるかがデータとして渡される。
コーディングフェイズの制限時間が75分、その中でとれる最高の得点を求める問題。
ただし問題の得点はそれを解いた時間をtとして、Easy=得点-2t、Medium=得点-4t、Hard=得点-8tとし、luck分だけそれぞれの回答時間をなかった事にできる(ただし、それぞれt<1にすることはできない。

解法

Greedyのはず。が、落ちた。
見てみると1つのケースで10足りてない・・・おかしい
luckが0の時は、Hardから貪欲で。
それ以外は、luckをどこから使うかで場合分けし、一番多いものを取る・・・でいいはずなんだけど・・・
つまりHardからluckを使っていったとき、Hardにはluckを使わずMedium、Easyで使うとき、Easyで使うとき。
これで殆どのケースは通ることになっている。

Hard

順位表が与えられる。Yと書かれてるところには"Passed","Failed",Challenge Succeed"のいずれかが入る。
順位がなりたつ順位表は何通りあるか?

解法

これ、手で解いたほうが早いよねwww
とりあえず場合わけするしかないと思うんで多分そうだとおもいます。