• 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 }
  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4338972.html
Copyright © 2020-2023  润新知