zoukankan      html  css  js  c++  java
  • HDU 4393 Throw nails(贪心加模拟,追及问题)

      题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115361#problem/D

      题意大致是:给出最多50000个人,拥有最初速度F和1秒后的速度V,(F<=500,V<=100)每秒将速度最快的那个人淘汰,按淘汰的人的顺序输出他们的序号。

      思路:由于人数很多,用暴力更新每秒淘汰的人显然会TLE。注意到F很小,那么对于任意两个人来说,即使有500的路程差,速度快的那个人哪怕是每秒只快1米,在501秒后就能超越,也就是说,501秒以后速度越快的人就一直处于快的地位,速度一样的人,F大的先被淘汰,再一样,按照序号小的先淘汰即可;那么在501秒以后只要按照这个方法排一个序即可。而对于501秒以内的,只要暴力模拟每秒淘汰最快的即可。

      当然,这是按照F范围小赖考虑的,V范围小的方法还不会- -,,下次会了再补上。

      下面给出AC代码:

      

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <set>
     4 #include <string.h>
     5 using namespace std;
     6 struct node
     7 {
     8     int id;
     9     int v;
    10     int f;
    11     int s;
    12 }P[50000+5];
    13 int tot;
    14 bool cmp(node A,node B)
    15 {
    16     if(A.v==B.v)
    17     {
    18         if(A.f==B.f)
    19         {
    20             return A.id<B.id;
    21         }
    22         else return A.f>B.f;
    23     }
    24     else return A.v>B.v;
    25 }
    26 
    27 int main()
    28 {
    29     int T;
    30     scanf("%d",&T);
    31     for(int kace=1;kace<=T;kace++)
    32     {
    33         tot=0;
    34         int n;
    35         scanf("%d",&n);
    36         for(int i=1;i<=n;i++)
    37         {
    38             int f,v;
    39             scanf("%d%d",&f,&v);
    40             P[++tot]=(node){i,v,f,f};
    41         }
    42         printf("Case #%d:
    ",kace);
    43         for(int i=1;i<=501;i++)
    44         {
    45             if(i>n) break;
    46             int id=1;
    47             int maxsum=-1;
    48             for(int j=1;j<=tot;j++)
    49             {
    50                 if(i!=1&&P[j].s!=-1) P[j].s+=P[j].v;
    51                 if(maxsum<P[j].s) {id=P[j].id;maxsum=P[j].s;}
    52             }
    53             if(i!=1) printf(" ");
    54             printf("%d",id);
    55             P[id].s=P[id].f=P[id].v=-1;
    56         }
    57         sort(P+1,P+1+tot,cmp);
    58         for(int i=1;i<=n-501;i++)
    59         {
    60             printf(" %d",P[i].id);
    61         }
    62         puts("");
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    [bzoj5483][Usaco2018 Dec]Balance Beam_凸包_概率期望
    [bzoj3829][Poi2014]FarmCraft_树形dp
    [bzoj3420]Poi2013 Triumphal arch_树形dp_二分
    [bzoj4240]有趣的家庭菜园_树状数组
    [CF9D]How Many Trees?_动态规划_树形dp_ntt
    拖拽排序
    windows-build-tools
    阿里云七牛云oss获取视频内的帧图片
    转义符输入的转换
    node脚本下载geo数据
  • 原文地址:https://www.cnblogs.com/zzyDS/p/5474026.html
Copyright © 2011-2022 走看看