Car 高精度

车子从起始位置 <script type="math/tex" id="MathJax-Element-153">0</script> 开始到达终点一共有 <script type="math/tex" id="MathJax-Element-154">N</script> 个位置被标记,每个位置被标记的时间都是整数时间,并且车子速度在每段儿都可以理解为匀速运动,不过整体趋势是不递减的。问,车子最短时间达到终点的时间花费。

问题的核心也就是给每一段合理的分配时限,使时间花费最小。

那么我们可以逆向贪心模拟,最好一段肯定是一秒花费,根据这个速度来往前推,速度不严格递减,但是要保证每段时间是整数,所以速度可以是小数,那么为了避免精度丢失,我们可以采用分数形式来表示。一直推到起点位置,累计时间即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int inf=0x3f3f3f3f;
 5 const int maxn=1e5+10;
 6 double a[maxn];
 7 int main()
 8 {
 9     int T;
10     scanf("%d",&T);
11     int Case=0;
12     while(T--){
13         int n;
14         scanf("%d",&n);
15         for(int i=1;i<=n;i++){
16             scanf("%lf",&a[i]);
17         }
18         ll ans=1;
19         double dis1=a[n]-a[n-1];
20         double time1=1;
21         for(int i=n-1;i>=1;i--){
22             double dis2=a[i]-a[i-1];
23             int tmp=ceil(dis2*time1/dis1);
24             ans+=tmp;
25             dis1=dis2;
26             time1=tmp;
27         }
28         printf("Case #%d: %lld\n",++Case,ans);
29     }
30     return 0;
31 }

 

posted @ 2020-10-07 23:44  古比  阅读(156)  评论(0编辑  收藏  举报