北大ACM(POJ1018-Communication System)
Question:http://poj.org/problem?id=1018
问题点:枚举。
1 Memory: 564K Time: 329MS 2 Language: C++ Result: Accepted 3 4 #include <iostream> 5 #include <iomanip> 6 using namespace std; 7 8 struct BP 9 { 10 int i;//第i种设备 11 int B;//设备带宽 12 int P;//设备价格 13 }; 14 int cmp1(const void* a,const void* b)//排序按 i,P 升序排列 15 { 16 BP* ca = (BP*)a; 17 BP* cb = (BP*)b; 18 return (ca->i==cb->i?(ca->P - cb->P):(ca->i - cb->i)); 19 } 20 int cmp2(const void* a,const void* b)//排序按 B 升序排列 21 { 22 BP* ca = (BP*)a; 23 BP* cb = (BP*)b; 24 return ca->B - cb->B; 25 } 26 int main() 27 { 28 int eg,num; 29 cin>>eg; 30 BP bp[10000];//排序按 i,P 升序排列 31 BP orderB[10000];//排序按 B 升序排列 32 double maxBP;//结果 33 int same,maxB,temp,i,j,k,cnt,idx; 34 while(eg--) 35 { 36 cin>>num; 37 memset(bp,0,sizeof(bp)); 38 k = cnt = maxB = 0; 39 maxBP = 0; 40 for(i=0;i<num;i++) 41 { 42 cin>>same;//一种设备的数量 43 cnt += same;//所有设备的数量 44 temp = 0;//记录一种设备的最大带宽 45 for(j=0;j<same;j++,k++) 46 { 47 bp[k].i = i; 48 cin>>bp[k].B>>bp[k].P; 49 temp = (temp>0 && temp>bp[k].B)?temp:bp[k].B; 50 } 51 maxB = (maxB>0 && maxB<temp)?maxB:temp;//取所有设备最大带宽的的最小值,即B的取值上限 52 } 53 memcpy(orderB,bp,sizeof(bp)); 54 qsort(bp,cnt,sizeof(BP),cmp1);//排序按 i,P 升序排列,用于取各类设备中大于B的最小P 55 qsort(orderB,cnt,sizeof(BP),cmp2);//排序按 B 升序排列 ,用于枚举B 56 for(i=0;i<cnt && orderB[i].B<=maxB;i++) 57 { 58 k = orderB[i].B;//枚举B 59 temp = orderB[i].P;//当前情况 最小P 60 for(j=0,idx=0;j<cnt && idx < num;j++) 61 { 62 if(bp[j].i == orderB[i].i || bp[j].B < k || idx > bp[j].i) continue; 63 temp += bp[j].P; 64 idx = bp[j].i+1;//如果第j类设备已取,idx指向下一类设备,(不能使用 idx++) 65 } 66 maxBP = (maxBP > 0 && maxBP > double(k)/temp?maxBP:double(k)/temp);//取最大B/P值 67 } 68 cout<<fixed<<setprecision(3)<<maxBP<<endl;//输出必须小数点后3位,如1要输出1.000 69 } 70 //system("pause"); 71 return 0; 72 }
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步