首页 > 代码库 > live archive 3971
live archive 3971
/** * @brief live archive 3971 * @file 3971.cpp * @author mianma * @created 2014/12/22 16:23 * @edited 2014/12/22 16:23 * @type binart_search * @note * @cost time n*log(MAXQ) * @cost mem MAXN*sizeof(struct compent) */ #include <fstream> #include <iostream> #include <string> #include <vector> #include <cstring> #include <map> using namespace std; #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) > (b) ? (b) : (a)) #define abs(a) ((a) > 0 ? (a) : (0 - (a))) #define CLR(vec) memset(vec, 0, sizeof(vec)) #ifdef DEBUG ifstream in; ofstream out; #define CIN in #define COUT out #else #define CIN cin #define COUT cout #endif #define MAXN 1000 #define MAXP 1000000 #define MAXQ 1000000000 int cnt = 0; /*compent type tots*/ map<string, int> id; int n, cases, budget; int get_id(const string &str){ /*get type id*/ if(!id.count(str)) id[str] = cnt++; return id[str]; } struct compent{ int quality; int price; }; vector<struct compent> table[MAXN + 10]; void init_db(void){ for(int i = 0; i < cnt; i++) table[i].clear(); cnt = 0; } /** * @brief check if we can assemble a computer * @param[in] min quality of the computer * @param[in] budget of the computer */ bool check_compent(int quality, int budget){ int sum = 0, i, j; for(i = 0; i < cnt; i++){ vector<struct compent> &objs = table[i]; int price = MAXP + 10; for(j = 0; j < objs.size(); j++){ struct compent obj = objs[j]; if(obj.quality < quality) continue; else price = min(obj.price, price); } if(MAXP + 10 == price) return false; else sum += price; } return (sum > budget ? false : true); } int main(void){ string type, name; int price, quality; ios_base::sync_with_stdio(0); #ifdef DEBUG CIN.open("./in", ios::in); COUT.open("./out", ios::out); #endif CIN >> cases; while(cases--){ init_db(); CIN >> n >> budget; while(n--){ CIN >> type >> name >> price >> quality; struct compent obj; obj.quality = quality; obj.price = price; table[get_id(type)].push_back(obj); } int lft = 0; int rht = MAXQ; while(lft < rht){ int mid = (rht - lft + 1)/2 + lft; #ifdef DEBUG COUT << lft << "<->" << rht << "\n"; COUT << "mid:" << mid << "-> "<< (check_compent(mid, budget) ? "ture" : "false") << "\n"; #endif if(check_compent(mid, budget)){ lft = mid; }else{ rht = mid - 1; } } COUT << lft << "\n"; } return 0; }
live archive 3971
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。