hdu 6581 Vacation

多校第一场的签到题。。全场都在过就我不会。。。

正解O(n)估计出题人都没想到。。
如果把两辆车怼到一起看成一个事件,可以用堆维护,每次合并两辆车,但是比较麻烦。

然而观察会发现答案肯定是某辆车堵着后面所有车。那么只要枚举每辆车,假设它堵着后面的车,然后算一下通过时间的最大值就行了。因为如果它不堵着后面的车,那么肯定它更快通过线,比真实答案小。如果它也被前面的车堵了,那么实际速度会变慢,这样算出来也会比真实答案小。。。

  1. #include <bits/stdc++.h>
  2. #define rep(i,a,b) for (int i=a;i<=b;i++)
  3. using namespace std;
  4. typedef double db;
  5. const int N=100010;
  6. db l[N],s[N],v[N],ss[N];
  7. int main(){
  8. 	int n,cnt=0;
  9. 	while (~scanf("%d",&n)){
  10. 		ss[0]=0;db ans=0;
  11. 		rep(i,0,n) scanf("%lf",s+i);
  12. 		rep(i,0,n) scanf("%lf",l+i);
  13. 		rep(i,0,n) scanf("%lf",v+i);
  14. 		rep(i,1,n) ss[i]=ss[i-1]+s[i];
  15. 		rep(i,0,n) ans=max(ans,(l[i]+ss[i])/v[i]);
  16. 		printf("%.10f\n",ans);
  17. 	}
  18. 	return 0;
  19. }

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注