2016ccpc杭州赛 hdu 5935 C.Car

9 篇文章 0 订阅


Car

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 93    Accepted Submission(s): 35


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.
 

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
1T100
1N105
0<ai109
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
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   5943  5942  5941  5940  5939 
 

Statistic |  Submit |  Discuss |  Note
这题我读了一下午没读懂说什么,赛后翻了别人题解的题意然后才知道这是一道水题。

题意:一辆车的速度是不递减的,问从0点开始到第n个点所需的时间最少可能为多少。到每个点的时间是整数。但速度可能不是整数。

思路:从后往前算,后面的速度肯定是大于等于前面的速度的。那么很容易求出最大的速度,再求出最小的时间。最后把时间加起来就是答案了。下面给代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<utility>
#include<map>
#define maxn 100005
typedef long long LL;
using namespace std;
const int mod=1e9+7;;
int a[maxn];
int main(){
    int t;
    scanf("%d",&t);
    for(int tcase=1;tcase<=t;tcase++){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        LL fz=a[n]-a[n-1];
        LL fm=1;
        LL ans=1;
        for(int i=n-2;i>=0;i--){
            int s=a[i+1]-a[i];
            int t=s*fm/fz;
            if((s*fm)%fz)
                ans+=++t;
            else
                ans+=t;
            fz=s;
            fm=t;
        }
        printf("Case #%d: %lld\n",tcase,ans);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值