UVALive 3971 Assemble

来源:互联网 发布:帝国cms淘宝客模板 编辑:程序博客网 时间:2024/05/17 17:56

刘汝佳大神书上的题目,思路是从大到小枚举最小价值的最大值,假设当前枚举到的价值数值是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;}


0 0
原创粉丝点击