http://acm.hdu.edu.cn/showproblem.php?pid=5935
给出一段上升的序列为每个点的位置,要求从0开始跑到最后一个点,并且每一段路的速度必须是非递减的,并且所花的时间需要是整数,但是速度可以是小数。
按照题意,这道题仍然是贪心题,因为速度是非递减的,所以可以得到一个结论,就是最后一段路的速度越大,前面的整体的平均速度就应该越大,那么最后一段路速度最大即只花1s就跑完,那么就可以从后往前面去推。但是这题因为速度可以为小数,所以为了精度准确,需要用分子和分母来表示速度。
#include<bits/stdc++.h>
using namespace std;
long long int a[111111];
long long int b[111111];
int main()
{
int T;
cin>>T;
int cs=1;
while(T--)
{
int n;
cin>>n;
cin>>a[1];
b[1]=a[1];
int i;
for(i=2;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i]-a[i-1];
}
long long int v1=b[n];
long long int v2=1;
long long int ans=1;
for(i=n-1;i>=1;i--)
{
v2*=b[i];
long long int t=v1;
v1=v2;
v2=t;
long long int zs=v1/v2+1;
if(v1%v2==0)zs--;
ans+=zs;
v1=b[i];
v2=zs;
}
cout<<"Case #"<<cs++<<": "<<ans<<endl;
}
return 0;
}