Car
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
Ruins is driving a car to participating in a programming contest. As on a very tight schedule, he will drive the car without any slow down, so the speed of the car is non-decrease real number.
Of course, his speeding caught the attention of the traffic police. Police record N positions of Ruins without time mark, the only thing they know is every position is recorded at an integer time point and Ruins started at 0 .
Now they want to know the minimum time that Ruins used to pass the last position.
Of course, his speeding caught the attention of the traffic police. Police record N positions of Ruins without time mark, the only thing they know is every position is recorded at an integer time point and Ruins started at 0 .
Now they want to know the minimum time that Ruins used to pass the last position.
Input
First line contains an integer
T
, which indicates the number of test cases.
Every test case begins with an integers N , which is the number of the recorded positions.
The second line contains N numbers a1 , a2 , ⋯ , aN , indicating the recorded positions.
Limits
1≤T≤100
1≤N≤105
0<ai≤109
ai<ai+1
Every test case begins with an integers N , which is the number of the recorded positions.
The second line contains N numbers a1 , a2 , ⋯ , aN , indicating the recorded positions.
Limits
1≤T≤100
1≤N≤105
0<ai≤109
ai<ai+1
Output
For every test case, you should output
'Case #x: y', where
x indicates the case number and counts from
1 and
y is the minimum time.
Sample Input
1 3 6 11 21
Sample Output
Case #1: 4
注意精度问题,假设最后一段为一秒钟完成。往回退,如果可以以当前的速度行驶,就以当前速度行驶,加上对应的时间,如果不行那就把时间加一,更新速度。注意精度即可
#include<iostream>
#include<cmath>
using namespace std;
long long num[100005];
int cal(double e)
{
if((e)<1e-8)
{
return 0;
}
else if(e>0)
{
return 1;
}
}
int main()
{
int cas;
scanf("%d",&cas);
int c=0;
int n;
while(cas--)
{
scanf("%d",&n);
num[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
double v=num[n]-num[n-1];
int ans=1;
for(int i=n-1;i>=1;i--)
{
int dis=num[i]-num[i-1];
double temp=dis*1.0/(v);
int flag=cal(temp-(int)temp);
if(flag==0)
{
ans+=(int)temp;
}
else if(flag==1)
{
ans+=(int)temp+1;
v=dis*1.0/(int)(temp+1);
}
}
printf("Case #%d: %d\n",++c,ans);
}
}