zoukankan      html  css  js  c++  java
  • 组装电脑(二分答案)

    组装电脑

    时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版]

    题目描述

    你有b块钱,想要组装一台电脑。给出n个配件各自的种类,品质因子和价格,要求每种类型配件给买一个,总价不超过b,且“品质最差的配件”的品质因子尽量大。

    输入

    输入的第一行为测试数据T(T<=1000)。每组数据的第一行为两个正整数n(1<=n=1000)和b(1<=b<=109),即配件的数目和预算;以下n行每行描述一个配件,依次为种类,名称,价格和品质因子。其中价格为不超过106的非负整数;品质因子是不超过109的非负整数(越大越好);种类和名称则由不超过20个字母,数字和下划线组成。输入保证总有解。

    输出

    对于每组数据,输出配件最小的品质因子的最大值。

    样例输入

    1
    18 800
    processor 3500_MHz 66 5
    processor 4200_MHz 103 7
    processor 5000_MHz 156 9
    processor 6000_MHz 219 12
    memory 1_GB 35 3
    memory 2_GB 88 6
    memory 4_GB 170 12
    mainbord all_onboard 52 10
    harddisk 250_GB 54 10
    harddisk 500_FB 99 12
    casing midi 36 10
    monitor 17_inch 157 5
    monitor 19_inch 175 7
    monitor 20_inch 210 9
    monitor 22_inch 293 12
    mouse cordless_optical 18 12
    mouse microsoft 30 9
    keyboard office 4 10

    样例输出

    9
    下面的代码是刘汝佳蓝本p28上的,啃完之后就打了出来,作了注释,便于自己理解;
    还是二分答案 问什么分什么 问的是品质因子 那么就二分品质因子,限制条件就是价格了;
    【代码】
     1 include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<string>
     5 #include<vector>//动态数组 
     6 #include<map>//关联式容器
     7 using namespace std;
     8 int cnt;//组件的种类数 
     9 map<string,int>id; 
    10 const int MAXN=1009;
    11 struct component//定义结构体,每个组件的质量和价格 
    12 {
    13     int price,quality;
    14 };
    15 vector<component>comp[MAXN];//结构体类型的动态数组 
    16 int n,b;//元件个数,钱;
    17 int ID(string s)
    18 {
    19     if(!id.count(s))id[s]=cnt++;//如果这个类型没有出现,组件类型数+1; 
    20     return id[s];//返回它是第几个类型 
    21 }
    22 bool ok(int q)//品质因子不小于q的组件能否组成一个不超过b的电脑 
    23 {
    24     int sum=0;//价钱 
    25     for(int i=0;i<cnt;i++)//列举每个类型 
    26     {
    27         int cheapest=b+1,m=comp[i].size();//m为每个类型的组件数 
    28         for(int j=0;j<m;j++)
    29         if(comp[i][j].quality>=q)cheapest=min(cheapest,comp[i][j].price);//找大于q价格中最小的那一个 
    30         if(cheapest==b+1)return 0;//如果没找到说明不能组装电脑 
    31         sum+=cheapest;//累计价格 
    32         if(sum>b)return 0;//如果当前价格比b大说明不能组装电脑 
    33     }
    34     return 1;//进行到了这一步,说明可以组装 
    35  } 
    36 int main()
    37 {
    38     int T;//T为测试数据 
    39     scanf("%d",&T);//输入 
    40     while(T--)
    41     {
    42         scanf("%d%d",&n,&b);//输入组件数和价钱 
    43         cnt=0;
    44         for(int i=0;i<n;i++)
    45         comp[i].clear();//清空
    46         id.clear();//初始化 
    47         int maxq=0;//确定二分区间右端点,为品质因子最大值 
    48         for(int i=0;i<n;i++)//输入n个配件 
    49         {
    50             char type[30],name[30];//类型 名字 
    51             int p,q;
    52             scanf("%s%s%d%d",&type,&name,&p,&q);
    53             maxq=(maxq,q);
    54             comp[ID(type)].push_back((component){p,q});//放入动态数组,ID(type)为这个类型是第几个,放入第几个类型中 
    55          } 
    56          int l=0,r=maxq;//二分答案过程 
    57          while(l<r)
    58          {
    59              int m=l+(r-l+1)/2;
    60              if(ok(m))l=m;//m是否可以 
    61              else
    62              r=m-1;
    63          }
    64          printf("%d",l);//输出答案 
    65      } 
    66      return 0;
    67 }
  • 相关阅读:
    python 使用else代替状态变量
    python 实现线程安全的单例模式
    sql语句的执行顺序
    python 实现int函数
    python实现时间o(1)的最小栈
    python实现简单的负载均衡
    python实现求最长回文子串长度
    python lambda表达式
    sql针对某一字段去重,并且保留其他字段
    基本认识
  • 原文地址:https://www.cnblogs.com/zzyh/p/6636928.html
Copyright © 2011-2022 走看看