这题是求最大的最小值,常用的方法就是二分了,需要注意的是二分的边界,每次二分得到一个品质因子,再把品质因子大于或等于的每类配件最小的价格加起来。不断的二分,找到最终的品质因子。
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <string>
using namespace std;
struct PeiJian
{
int price;
int quality;
};
bool cmp(PeiJian a,PeiJian b){
if(a.price!=b.price)
return a.price<b.price;
return a.quality>b.quality;
}
int main(){
int i,j;
int T;
scanf("%d",&T);
while(T--){
int n,money;
char str1[1000];
char str2[1000];
map<string,int> mmm;
vector<PeiJian> vvv[1005];
string str;
PeiJian temp;
int price;
scanf("%d%d",&n,&money);
int k=0;
int maxq=-200000000;
int minq;
for(i=0;i<n;i++){
scanf("%s %s %d %d",str1,str2,&temp.price,&temp.quality);
if(maxq<temp.quality)
maxq=temp.quality;
str=str1;
if(mmm.count(str)){
vvv[mmm[str]].push_back(temp);
}
else{
vvv[k].push_back(temp);
mmm[str]=k;
k++;
}
}
for(i=0;i<k;i++){
sort(vvv[i].begin(),vvv[i].end(),cmp);
}
int mid;
int type_ccc;
minq=0;
while(minq<maxq){
int sum=0;
type_ccc=0;
mid=(minq+maxq)/2;
for(i=0;i<k;i++){
for(j=0;j<vvv[i].size();j++){
if(vvv[i][j].quality>=mid){
sum+=vvv[i][j].price;
type_ccc++;
break;
}
}
}
if(type_ccc==k && sum<=money)
minq=mid;
else
maxq=mid-1;
}
printf("%d\n",minq);
}
return 0;
}
/*
3
6 703
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 600 6
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
*/