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 }
  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/zzyh/p/6636928.html
Copyright © 2011-2022 走看看