zoukankan      html  css  js  c++  java
  • hdu 5188 dfs+二分

    get了很多新技能

    当时想到了用dfs,但是排序用的是限制时间排序,一直没搞出来。

    正解:

    二分用时,dfs判断,为了顺利进行做题,需要按照做题开始时间排序

    还可以用dp

    题意:

    作为史上最强的刷子之一,zhx常常参与各种比赛。
    有一天,zhx去虐一场比赛。他觉得题太简单了。
    这场比赛有n道题。他一眼就已经计算出他做第i道题要花ti的时间,做完后可以得到vi分。
    因为他太强了,所以他被管理员盯上了。如果他在第li个单位时间前做完了第i道题,那么管理员就会认为他在作弊,然后把他的号封了。
    zhx不一定把所有题都做完。他只需要拿到不少于w分就满足了。他让你告诉他他最小需要花费多少时间才能拿到足够的分数并且不被封号。或者说他根本不能拿到那么多分。
    注意,zhx只能同时做一道题,而且他一旦开始做一道题,就非得把它做出来不可。然后他会在做完后立即提交代码。
    1 3
    1 4 7
    3 6
    4 1 8
    6 8 10
    1 5 2
    2 7
    10 4 1
    10 2 3

    7
    8
    zhx is naive!
     
     
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=35;
     6 long long sum[maxn];
     7 int n,w;
     8 struct node
     9 {
    10     int t,v,l;
    11     void input()
    12     {
    13         scanf("%d%d%d",&t,&v,&l);
    14     }
    15     friend bool operator<(node a,node b)
    16     {
    17         return a.l-a.t<b.l-b.t;
    18     }
    19 }q[maxn];
    20 bool dfs(int p,int tot,long long va)
    21 {
    22     if(va>=w)   return 1;
    23     if(p<0) return 0;
    24     if(va+sum[p]<w) return 0;   //如果加上剩下的价值仍小于w
    25     if(tot-q[p].l>=0&&tot-q[p].t>=0)    if(dfs(p-1,tot-q[p].t,va+q[p].v))   return 1;
    26     if(dfs(p-1,tot,va)) return 1;
    27     return 0;
    28 }
    29 int main()
    30 {
    31     #ifndef ONLINE_JUDGE
    32     freopen("1.in","r",stdin);
    33     #endif
    34     int i,j,k;
    35     while(scanf("%d%d",&n,&w)!=EOF)
    36     {
    37         for(i=0;i<n;i++)    q[i].input();
    38         sort(q,q+n);
    39         /*for(int i=0;i<n;i++)
    40         {
    41             printf("%d %d %d
    ",q[i].t,q[i].v,q[i].l);
    42         }*/
    43         for(i=0;i<n;i++)
    44         {
    45             if(i==0)    sum[i]=q[i].v;
    46             else sum[i]=sum[i-1]+q[i].v;
    47         }
    48         if(sum[n-1]<w)
    49         {
    50             printf("zhx is naive!
    ");
    51             continue;
    52         }
    53         int l=0,r=100000*n;  //最高用时
    54         int ans;
    55         while(l<=r)
    56         {
    57             int mid=(l+r)>>1;
    58             if(dfs(n-1,mid,0))  r=mid-1,ans=mid;
    59             else l=mid+1;
    60         }
    61         printf("%d
    ",ans);
    62     }
    63 }
  • 相关阅读:
    关于钩子函数的详细解答:
    Vue实现回到顶部
    Vue实现Rate组件(星星评分)
    Vue-router 路由模式
    javascript中实现跨域的方式
    Promise
    webpack使用
    小程序登录
    api工厂的sdk的使用
    面试题划“重点”
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4338972.html
Copyright © 2011-2022 走看看