Fish买电脑
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
对于电脑中的每一个零件他们买且只买一个。现在的问题是每一种零件都有好多品牌,品牌下又分好多型号,不同型号的价钱不等,同时它们的质量也不一样。而整个电脑的质量取决于各零件中质量最差的那个。所以我们需要在不超出预支金额的情况下,尽量使得质量最差的那个零件的质量最大化,这样我们购买的电脑总体质量才不至于太低。
Input
对于每组测试数据:
第一行有两个整数n和M,表示需要购买的零件种类和Fish买电脑预支的金额。
接下来的n行代表每一种零件的信息,这些信息以”类型 型号 价格 质量”的格式给出,他们之间以一个空格分隔。这四个属性中:
“类型”为一个字符串,仅包含小写字母。不超过20个字符。
“型号”为一个字符串,包含字母,数字,下划线。不超过20个字符。
“价格”为一个正整数。
“质量”为一个正整数,数值越大则质量越高。
范围:
T ≤ 100
1 ≤ n ≤ 1 000
1 ≤ M ≤ 1 000 000 000
0 ≤ price ≤ 1 000 000
0 ≤ quality ≤ 1 000 000 000
Output
Sample Input
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
Sample Output
9代码:
#include<stdio.h>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
#define MIN(a,b) (a<b?a:b)
#define INF 1<<30
int fee[1005];
int n,m;
map<int,int>mp;
struct node
{
char name[25];
char type[25];
int p,q;
bool operator < (node temp) const
{
return strcmp(name,temp.name)<0;
}
}e[1005];
struct point
{
int x;
bool operator < (point temp) const
{
return x<temp.x;
}
bool operator == (point temp) const
{
return x==temp.x;
}
}p[1005];
int AC(int x)
{
for(int i=0;i<1005;i++)
fee[i]=INF;
int left=m,index=-1;
for(int i=0;i<n;i++)
{
if(i==0)
{
index++;
if(mp[e[i].q]>=x)
fee[index]=MIN(fee[index],e[i].p);
}
else
{
if(strcmp(e[i].name,e[i-1].name)==0)
{
if(mp[e[i].q]>=x)
fee[index]=MIN(fee[index],e[i].p);
}
else
{
left-=fee[index];
if(left<0)
return 0;
index++;
if(mp[e[i].q]>=x)
fee[index]=MIN(fee[index],e[i].p);
}
}
}
left-=fee[index];
if(left<0)
return 0;
return 1;
}
int bsearch(int l,int r)
{
int m,ret;
while(l<=r)
{
m=(l+r)/2;
if(AC(m))
{
ret=m;
l=m+1;
}
else
r=m-1;
}
return ret;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mp.clear();
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%s %s %d %d",e[i].name,e[i].type,&e[i].p,&e[i].q);
p[i].x=e[i].q;
}
sort(e,e+n);
sort(p,p+n);
int cnt=unique(p,p+n)-p;
for(int i=0;i<cnt;i++)
mp[p[i].x]=i;
int ret=bsearch(0,cnt-1);
printf("%d\n",p[ret].x);
}
return 0;
}
链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=16638&pid=1003