首页 > 代码库 > HDU 5935 Car

HDU 5935 Car

题意:

一个人在开车 一个交警在抓拍

给了你n个数字 是每次抓拍时候的位置

这个人一直是不减速的 问从0到最后给你的那个点最短时间是多少

 

思路:

我们倒着推 把最后一段当作一秒跑完的 并且把这个值设为当前速度

如果前面有一段不是当前速度的整数倍 就更新当前速度

 

题不是很难 但是坑点比较多

 

 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(a) cerr<<#a<<"=="<<a<<endl 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int> pii; 7  8 const int maxn=1e5+10; 9 10 int a[maxn];11 12 int main()13 {14     int T,cas=1;15     scanf("%d",&T);16     while(T--)17     {18         int n;19         scanf("%d",&n);20         a[0]=0;21         for(int i=1;i<=n;i++)22         {23             scanf("%d",&a[i]);24         }25         ll ans=0; //第一个坑点就是ans会爆int 要用ll26         double mx=a[n]-a[n-1];//第二个坑点就是要用double来记录最大速度27         for(int i=n;i>=1;i--)28         {29             double dis=(a[i]-a[i-1])*1.0;30             int t=dis/mx;31             if(dis/t==mx)//这个也不算坑点 因为抓拍不是一秒一张 所以是整数倍就可以了32             {33                 ans+=t;34             }35             else36             {37                 ans+=(t+1);38                 mx=dis/(t+1);39             }40         }41         printf("Case #%d: %lld\n",cas++,ans);42     }43     return 0;44 }/*45 46 147 348 6 11 2149 50 */

 

HDU 5935 Car