题意:一辆车在作一个不减速运动。按顺序记录这辆车整秒时的位置,问这辆车最少用多少秒跑完这条路。
思路:先预处理每个间隔的长度。易证明,要使得总时间最少,最后一个间隔一定是一秒。然后
diti<=di+1ti+1
通过这个式子算出最小的
ti
,倒着推上去就好了。
#include<bits/stdc++.h>
#define maxn 111111
int a[maxn];
int d[maxn];
int tt[maxn];
using namespace std;
int main()
{
int t;
int kase=0;
scanf("%d",&t);
while(t--) {
int n;
scanf("%d",&n);
a[0]=0;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++) {
d[i]=a[i]-a[i-1];
}
long long ans=0;
tt[n]=1;
for(int i=n-1;i>=1;i--) {
tt[i]=ceil((double)d[i]*(double)tt[i+1]/(double)d[i+1]);
}
for(int i=1;i<=n;i++)
ans+=tt[i];
printf("Case #%d: %lld\n",++kase,ans);
}
return 0;
}