题意:

      你有b块钱,想要组装一台电脑,给你提供一些零件,每种零件提供一个或几个,组装电脑的前提是每种零件只能也必须选择一个,每种零件都有自己的种类,名字,价格,还有品质,要求是在能配成电脑的前提下所有零件中最小的品质最大(品质越大越好)。

思路:

      最小的最大,第一反应就是二分,这个题目也不例外,我们只要二分品质就行了,品质的数据感觉比较大,但是直接去枚举应该也能过,如果担心过不了可以先把零件中所有涉及的品质都拿出来,答案肯定是这些数据中的一个,我们只要sort下,然后去二分枚举sort后的品质数组,每次枚举我们都会得到一个当前的品质值,对于每种物品,我们肯定是选择品质值满足要求的最小花费的那个零件,其他的没什么,细心点就行了,具体细节可以看代码。

     

     

      

#include<map>

#include<stdio.h>

#include<algorithm>

#include<string.h>

#include<string>

#define N 1000 + 10

using namespace std;

typedef struct

{

   int jg ,pz;

   char str[22];

}NODE;

NODE node[N];

map<string ,int>mark;

int tmp[N] ,P[N] ,nowidp;

bool camp(NODE a, NODE b)

{

    return a.jg < b.jg;

}

bool ok(int nowpz ,int n ,int szl ,int b)

{

    mark.clear();

    int sszl = 0 ,nowb = 0;

    for(int i = 1 ;i <= n ;i ++)

    {

        if(node[i].pz < nowpz) continue;

        if(!mark[node[i].str]) sszl ++ ,nowb += node[i].jg;

        mark[node[i].str] = 1;

    }

    return sszl == szl && nowb <= b;

}

        

       

   

int main ()

{

    int n ,b ,i ,szl ,t;

    char str[22];

    scanf("%d" ,&t);

    while(t--)

    {

        scanf("%d %d" ,&n ,&b);

        mark.clear();

        szl = 0;

        for(i = 1 ;i <= n ;i ++)

        {

           scanf("%s %s %d %d" ,node[i].str ,str ,&node[i].jg ,&node[i].pz);

           if(!mark[node[i].str]) szl ++;

           mark[node[i].str] = 1;

           tmp[i] = node[i].pz;

        }

        sort(node + 1 ,node + n + 1 ,camp);

        sort(tmp + 1 ,tmp + n + 1);

        nowidp = 0;

        for(i = 1 ;i <= n ;i ++)

        if(i == 1 || tmp[i] != tmp[i-1])

        P[++nowidp] = tmp[i];

        

        int low = 1 ,up = nowidp ,mid ,Ans = P[1];

        while(low <= up)

        {

           mid = (low + up) / 2;

           if(ok(P[mid] ,n ,szl ,b))

           {

              Ans = P[mid];

              low = mid + 1;

           }

           else up = mid - 1;

        }

        printf("%d\n" ,Ans);

    }

    return 0;

}

        

        

        

        

    

最新文章

  1. 【iOS 使用github上传代码】详解
  2. 写了placement new就要写placement delete
  3. python时间时分秒与秒数的互相转换
  4. Java Override/Overload
  5. PHP get_class 返回对象的类名
  6. 三国杀3v3心法——总述篇
  7. arcgis通过 Python 使用工具 获得结果信息
  8. Linux定时任务编写
  9. HDU 1088 - Write a simple HTML Browser
  10. 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列
  11. .NET中TextBox控件设置ReadOnly=true后台取不到值 三种解决方法
  12. 用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)
  13. winform打开本地html页面
  14. 列式数据库~clickhouse 数据同步使用
  15. 【未完待续】API接口
  16. php的常量
  17. VMware Station NAT上网模式配置
  18. c#栈的习题2
  19. [JavaScript] css将footer置于页面最底部
  20. 20155303 实验二 Java面向对象程序设计

热门文章

  1. POJ-2253(最短路变形+dijikstra算法+求解所有路径中所有最长边中的一个最小值)
  2. Spring笔记(10) - 日志体系
  3. TripleDES对称加密解密 -[C#-JAVA]
  4. FreeBSD jail 折腾记(二)
  5. java 递归求二叉树深度
  6. P1962 斐波那契数列 【矩阵快速幂】
  7. PTA 找出不是两个数组共有的元素
  8. Vite2+Electron仿抖音|vite2.x+electron12+vant3短视频|直播|聊天
  9. Go 语言入门教程,共32讲,6小时(已完结)
  10. MongoDB 那些事(一文以蔽之)