Car
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 256 Accepted Submission(s): 92
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
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
a
1![]()
,
a
2![]()
,
⋯
,
a
N![]()
, indicating the recorded positions.
Limits
1≤T≤100
1≤N≤10
5![]()
0<ai≤10
9![]()
a
i
<a
i+1![]()
Every test case begins with an integers N
The second line contains N
Limits
1≤T≤100
1≤N≤10
0<ai≤10
a
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
Source
题意是每段路都必须在整数秒内走完 匀速 然后每段速度是非递减的 速度无上限 不得不说 做题时思维太狭隘太局面了 将整个路程分段了 其实从整体来看 将视点提高从全局看 既然速度非递减 那么最后一段路程的速度肯定是最大的啊 然后从后往前推就好了 至于精度听说double已经满足不了了 需要用分数表示速度。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 100010
using namespace std;
int a[maxn];
int gcd(int a,int b){
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int t,n,va,vb,ans,cnt=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
a[0]=0;
ans=0;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
a[i-1]=a[i]-a[i-1];
}
va=a[n-1];
vb=1;
ans=1;
for(int i=n-2;i>=0;--i){
int tem=ceil(a[i]*vb*1.0/va);//向上取整
ans+=tem;
vb=tem;
tem=gcd(a[i],tem);
va=a[i]/tem;
vb=vb/tem;
}
printf("Case #%d: %d\n",++cnt,ans);
}
return 0;
}