Water Tank (AOJ2180)
でんじろう先生じゃない方のWater Tank.こっちは打って変わってクソ簡単.なんで550なの・・・
にぶたんするだけ.しいて言うなら一周では足りないことに注意(二周して減ってるかどうかチェック) まあサンプルで分かるよね
#include <bits/stdc++.h> #define rep(i,n) for(int i=0;i<(int)(n);i++) #define rep1(i,n) for(int i=1;i<=(int)(n);i++) #define all(c) c.begin(),c.end() #define pb push_back #define fs first #define sc second #define show(x) cout << #x << " = " << x << endl #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) using namespace std; int N,s[86400],t[86400],u[86400]; double L; bool one(double& v,double a){ int x=0; rep(i,N){ v=min(L,v+(s[i]-x)*a); x=s[i]; v=min(L,v+(t[i]-x)*(a-u[i])); if(v<0) return 0; x=t[i]; } v=min(L,v+(86400-x)*a); return 1; } double can(double a){ double v=L; if(!one(v,a)) return 0; double v1=v; if(!one(v,a)) return 0; return abs(v-v1)<1e-9; } int main(){ while(true){ cin>>N>>L; if(N==0) break; rep(i,N) cin>>s[i]>>t[i]>>u[i]; double ub=1e6,lb=0; rep(tt,100){ double m=(ub+lb)/2; if(can(m)) ub=m; else lb=m; } printf("%.12f\n",ub); } }