刘汝佳大神书上的题目,思路是从大到小枚举最小价值的最大值,假设当前枚举到的价值数值是cur_value,就在每一种种类的配件中选择价格最低的且价值不小于cur_value的配件进行组装,算出最后总共要花多少钱,如果不超过题目给的上限,那么这个cur_value就是答案,否则继续枚举,题目说了测试数据保证一定有解,所以不用考虑找不到这个cur_value的情况。书上用了二分查找加速,我偷个懒不用二分,一样不会超时。
#include <stdio.h>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
typedef string TYPE;
typedef string NAME;
struct obj{
NAME name;
int value;
int cost;
};
map< TYPE, vector<struct obj> > all_obj;
vector<int> all_values;
set<int> visited;
int cmp_cost_ins(const void *a, const void *b){
struct obj *pa = (struct obj*)a;
struct obj *pb = (struct obj*)b;
return pa->cost - pb->cost;
}
int cmp_int_ins(const void *a, const void *b){
int *pa = (int*)a;
int *pb = (int*)b;
return *pa - *pb;
}
int max_value;
void func(int all_cost){
int cur_value, i, j;
int sum_cost;
bool find_target;
map< TYPE, vector<struct obj> >::iterator it;
vector<struct obj> cur_objs;
for(i=all_values.size()-1; i>=0; i--){
cur_value = all_values[i];
sum_cost = 0;
for(it=all_obj.begin(); it!=all_obj.end(); it++){
cur_objs = it->second;
find_target = false;
for(j=0; j<cur_objs.size(); j++){
if(cur_objs[j].value >= cur_value){
find_target = true;
break;
}
}
if(find_target){
sum_cost += cur_objs[j].cost;
}
else{
goto next_cur_value;
}
}
if(sum_cost <= all_cost)
break;
next_cur_value:
continue;
}
printf("%d\n", cur_value);
}
int main(void){
int T, all_cost, obj_num;
int i;
string name_str, type_str;
int cost, value;
char buf[30];
struct obj node;
map< TYPE, vector<struct obj> >::iterator it;
//freopen("input.dat", "r", stdin);
scanf("%d", &T);
while(T--){
all_obj.clear();
all_values.clear();
visited.clear();
scanf("%d %d", &obj_num, &all_cost);
for(i=1; i<=obj_num; i++){
scanf("%s", buf); type_str.assign(buf);
scanf("%s", buf); name_str.assign(buf);
scanf("%d %d", &cost, &value);
if(visited.find(value) == visited.end()){
visited.insert(value);
all_values.push_back(value);
}
if(value > max_value)
node.cost = cost; node.name = name_str; node.value = value;
all_obj[type_str].push_back(node);
}
for(it=all_obj.begin(); it!=all_obj.end(); it++){
qsort( &((it->second)[0]) , it->second.size(), sizeof(struct obj), cmp_cost_ins );
}
qsort(&(all_values[0]), all_values.size(), sizeof(int), cmp_int_ins);
func(all_cost);
}
return 0;
}