TopCoder SRM 267 Div1 Hard HairCuts

問題

9:00amに開き5:00pmに閉まる床屋がある。
客の来る時間のリストが与えられる。


床屋は、客が来たときに誰もいなければ、その客の髪を切り、
誰かがいれば、先に来た客全員の髪を切り終えてからその客の髪を切る。


一人の客の散髪には最低5分の時間がかかる。


最後の客が散髪を終えた時間が与えられるとき、
最も長く散髪に時間のかかった客の、散髪の時間の最小値を求めよ。

制約条件

客の数≦50

方針

二分探索。


一人の客にかかる時間がmであるとすると、
最後の客を終えるのにかかる時間がlastExit以前かどうかがO(n)で判定できる。


5以上の時間について二分探索すればいい。

ソースコード

int parse(string s){
	int a,b; sscanf(s.c_str(),"%d:%d",&a,&b);
	if(a<9)a+=12;
	return a*60+b;
}
bool ok(vi &t,int last,double mid){
	double now=9*60;
	rep(i,t.size()){
		now=max(1.0*t[i],now)+mid;
	}
	return now<=last;
}
class HairCuts {
	public:
	double maxCut(vector <string> enter, string lastExit) 
	{
		int n=enter.size(), last=parse(lastExit);
		vi t;
		rep(i,n)t.pb(parse(enter[i]));
		sort(all(t));
		
		double lo=5.0,hi=last-t[n-1],mid;
		rep(it,100){
			mid=(lo+hi)/2;
			
			if(ok(t,last,mid))lo=mid;
			else hi=mid;
		}
		return !ok(t,last,5)?-1:lo;
	}
};