您的位置:首页 > 其它

UVALive 3971 组装电脑

2016-07-05 19:51 225 查看
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1972
http://7xjob4.com1.z0.glb.clouddn.com/df5832a56667ea3317ca9166994f1eb6
题意:给电脑配件,价格和性能,求在指定总价内配件的最低性能最大。

思路:用二分方法,找出性能,使这个性能以上的配件能在指定价格内买到,最小值最大问题。

#include <bits/stdc++.h>
using namespace std;

const int maxn=1000+5;

int n,b,num;
char typec[25],namec[25];
int price,quality;
int fp[maxn][maxn],fq[maxn][maxn],m[maxn];

vector <string> tp;
void trans()
{
int i,j,l;
string s=typec;
l=tp.size();
for(i=0;i<l;i++)
{
if(tp[i]==s)
{
m[i+1]++;
fp[i+1][m[i+1]]=price;
fq[i+1][m[i+1]]=quality;
return;
}
}
tp.push_back(s);
m[l+1]++;
fp[l+1][m[l+1]]=price;
fq[l+1][m[l+1]]=quality;
}

int check(int qu)
{
int i,j,sum=0;
for(i=1;i<=num;i++)
{
int mi=1000000005;
for(j=1;j<=m[i];j++)
{
if(fq[i][j]>=qu && fp[i][j]<mi)
mi=fp[i][j];
}
if(mi==1000000005)
return 0;
sum+=mi;
}
if(sum<=b)
return 1;
else
return 0;
}

int main()
{
int T;
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&b);

memset(m,0,sizeof(m));
tp.clear();
for(i=1;i<=n;i++)
{
scanf("%s %s %d %d",typec,namec,&price,&quality);
trans();
}
num=tp.size();

int l=0,r=1000000005;
while(l+1<r)
{
int mid=(l+r)/2;
if(check(mid))
{
l=mid;
}
else
{
r=mid;
}
}

printf("%d\n",l);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: