SRM479 div2

ちょっと遅いけどSRMのことでも。

今回先輩の家に泊まってプログラミング合宿っぽいことをしてきました。桃鉄楽しかったです!!!

ついでにみんなでTopcoderしたんだけどみんな超無言でひたすら画面睨んでました。

初参加の先輩に惨敗して非常に悔しいし、もっと頭の中で条件を整理できるようにしたい。


フライト 250点

やるだけ問題。クソ簡単すぎて問題何度も見直してしまった。それでも結構早くsubmitできたつもりだったんだけど、みんなはもっと早かった。

早くSubmitしときゃ良かった。5点で100位以上差がつくくらい今回の250は簡単だった。

一応説明しとくと、

各地点へたどりつくために必要な燃料が与えられる。燃料がつきるまで何回飛べるか。

ソートとかして最大で飛べる区間数とか数えるのかと思ったらそんなことはなくて、forで回していって燃料切れたらreturnしたりカウントしていったりする、それだけ。

class TheAirTripDivTwo {
public:
	int find( vector <int> fl, int fuel ){
		int ret;
		rep(i,fl.size()){
			fuel -= fl[i];
			if(fuel < 0){
				return i;
			}
		}
		return fl.size();
	}
};

245.7 Pt.

コーヒーとティーを配ろう 500点

Coffee欲しい人とTea欲しい人が与えられる。(正確には全体の人数とTea欲しい人だけ与えられてて、そこからCoffee欲しい人抽出しなきゃならない。)

全員に配るのに最も効率的な渡し方をした時のかかる時間は何か。

英語のシュミレーション問題とか頭がおかしくなる。本当にヤバイ。発狂する。

まあ情報が整理できてなかっただけなんですが、250と比べるとクソ大変だった。1時間掛けても近い値は出るけどテストケース通らなかった。悔しい。

あとでやってみたら理由は分かって、ただ配り終えてから戻るまでの時間を加算してなかったっていう。

20分前くらいになって添字とか間違えまくってるのかなって思って全力で書き直したけど、多分間違ってなかったと思う・・・。あああああ・・・・・あとから言っても何も始まらないけどね。

あとでやったやつ

class TheCoffeeTimeDivTwo {
public:
	int give(vector<int> y){
	  	sort(y.begin(),y.end(),greater<int>());
	  	int ret=0,fill=0,pos=0;
	  	for(int i=0;i<y.size();i++){
			if(!fill){
				ret += 47 + y[i]*2 ; //ホントはココはi=0の時片道なので + y[i]だけだけど
				fill = 7;
			}
		  	fill--;
		  	ret += 4;
		  	ret+=pos-y[i]; 		//ここで相殺されてる(副作用的に。 i=0の時pos=0 だから。
			pos = y[i];
	  	}
		return ret + pos;
	}
	int find(int n, vector <int> t) {
		vector<int> c;
		for(int i=1;i<=n;i++)if( std::find(t.begin(),t.end(),i) == t.end() )c.push_back(i);
		return give(t)+give(c);
	}
};

Opened