zoukankan      html  css  js  c++  java
  • 【HDOJ】2333 Assemble

    二分+贪心策略。其中注释处很重要。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 #define MAXL 25
     9 #define MAXN 1005
    10 #define INF  1000000000
    11 
    12 typedef struct {
    13     char name[MAXL];
    14     int p, q;
    15 } comp_st;
    16 
    17 comp_st comps[MAXN];
    18 int t, n, b;
    19 int ns[MAXN], nn;
    20 
    21 bool comp(comp_st a, comp_st b) {
    22     int tmp = strcmp(a.name, b.name);
    23     if (tmp == 0)
    24         return a.q > b.q;
    25     else
    26         return tmp < 0;
    27 }
    28 
    29 bool chk(int x) {
    30     int i, j;
    31     int sum = 0, min;
    32 
    33     for (i=0; i<nn; ++i) {
    34         min = INF;
    35         for (j=ns[i]; j<ns[i+1]; ++j) {
    36             if (comps[j].q>=x && min>comps[j].p)
    37                 min = comps[j].p;
    38         }
    39         /* pay attention to here.*/
    40         if (min == INF)
    41             return false;
    42         sum += min;
    43     }
    44     return sum<=b;
    45 }
    46 
    47 int main() {
    48     int i, min, max, mid, v;
    49     char str[MAXL];
    50 
    51     scanf("%d", &t);
    52 
    53     while (t--) {
    54         scanf("%d %d", &n, &b);
    55         min = INF;
    56         max = 0;
    57         for (i=0; i<n; ++i) {
    58             scanf("%s %s %d %d", comps[i].name, str, &comps[i].p, &comps[i].q);
    59             if (comps[i].q < min) min = comps[i].q;
    60             if (comps[i].q > max) max = comps[i].q;
    61         }
    62         sort(comps, comps+n, comp);
    63         ns[0] = 0;
    64         for (nn=0,i=1; i<n; ++i) {
    65             if (strcmp(comps[i-1].name, comps[i].name) != 0)
    66                 ns[++nn] = i;
    67         }
    68         ns[++nn] = n;
    69         v = 0;
    70         while (min <= max) {
    71             mid = (min+max)/2;
    72             if ( chk(mid) ) {
    73                 v = mid;
    74                 min = mid+1;
    75             } else {
    76                 max = mid-1;
    77             }
    78         }
    79         printf("%d
    ", v);
    80     }
    81 
    82     return 0;
    83 }
  • 相关阅读:
    水题大战Vol.3 B. DP搬运工2
    火题小战 C. 情侣?给我烧了!
    火题小战 B. barbeque
    火题小战 A.玩个球
    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
    NOI2020D1T1美食家
    Java 的随机数
    MySQL 配置文件的配置
    NOIP2020准(ge)备(zi)日记
    android开发EditText禁止输入中文密码的解决方法
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3856087.html
Copyright © 2011-2022 走看看