zoukankan      html  css  js  c++  java
  • HDU 5935 Car(模拟)

    题目戳这

    题意:有个老司机开车,速度是一组非递减的序列,然后交警只记录了他的位置,问你,这个老司机要经过这些所有的位置最少需要的时间

    思路:因为速度要么是不变,要么是递增的,所以经过最后一个位置的时候速度是最大的,又因为没有给出对速度的限制,所以我们就让司机经过最后一段距离的时间为一秒,所以最后一段的速度就是其长度,然后往前递推出前面的速度。又因为时间是个整数,但是速度不一定是个整数,所以这道题还要注意精度问题,就是每次用当前的路程除以速度,然后得到时间的整数,如果这个长度除以这个时间整数不能得到这个速度,那就时间加一,然后算出新的时间,更新时间和答案就行了。

    P.S.一开始还以为速度为整数,然后还傻傻地想要用循环来更新时间,然后,不是超时就是WA,然后看了题解才知道,原来还可以是小数,不过也是,毕竟题目一直说的是实数和数字,并没有说是整数。

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<string.h>
     4 #include<math.h>
     5 #include<algorithm>
     6 #include<vector>
     7 #include<string>
     8 #include<queue>
     9 #include<map>
    10 #include<stack>
    11 #include<set>
    12 #include<list>
    13 #define ll long long
    14 #define maxn 100100
    15 #define PI acos(-1.0)    //圆周率
    16 const ll INF = 1e18;
    17 using namespace std;
    18 int T,n;
    19 int num[maxn];
    20 int main()
    21 {
    22     int cas=0;
    23     scanf("%d",&T);
    24     while(T--)
    25     {
    26         scanf("%d",&n);
    27         num[0]=0;
    28         for(int i=1;i<=n;i++)  scanf("%d",&num[i]);
    29 
    30         ll ans=0;
    31         double spe=num[n]-num[n-1];
    32         for(int i=n;i>0;i--)
    33         {
    34             double len=(num[i]-num[i-1])*1.0;
    35             int t=len/spe;
    36             ans+=t;
    37             if(len/t!=spe)
    38             {
    39                 ans++;
    40                 spe=len/(t+1);
    41             }
    42         }
    43 
    44         printf("Case #%d: %lld
    ",++cas,ans);
    45     }
    46 
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    利用模板方法模式导出Excel文件
    利用模板方法模式实现导出CSV文件功能
    抽象类多实现,省略this关键字调用实现类方法
    Spring工具类
    DateUtils工具类
    Java获取时间戳
    springMVC接受类型为Map,ajax请求参数类型为字符串将导致的请求400错误
    Set转逗号分隔字符串
    html标签中自定义属性
    编译安装MySQL
  • 原文地址:https://www.cnblogs.com/2cm-miao/p/6014041.html
Copyright © 2011-2022 走看看