pku1018

来源:互联网 发布:java 模拟http请求 编辑:程序博客网 时间:2024/05/01 03:34

题目大意是说:有m台机器,每台机器都有一定数量的候选设备,有两个属性:bandwidth和price。求出所有机器中的bandwidth最小值为B,price的和为P,则要求B/P最大。

问题的突破点在于bandwidth,即要B/P最大,又要是所有机器中bandwidth的最小值。可以根据这个条件,对所有bandwidth进行枚举,不满足所有机器中的最小值则去掉。满足条件的则贪心对price进行选择,即求price最小的(不违反贪心原则,因为此时bandwidth是确定的)。之后得出结果,代码如下:

#include<algorithm>#include<stdio.h>struct manu{int band;int price;};manu Manu[101][101];int mm[101];int band[101*101];double maxBP;int main(){int n,m;scanf("%d",&n);while(n != 0){scanf("%d",&m);int bp = 0;for(int i =0;i<m;i++){scanf("%d",&mm[i]);for(int j =0;j<mm[i];++j){scanf("%d%d",&Manu[i][j].band,&Manu[i][j].price);band[bp++] = Manu[i][j].band;}}maxBP = 0.0;for(int i = 0;i<bp;++i){double sum =0.0;bool flag = false;for(int j = 0;j<m;++j){int minp = 0xffff;for(int k =0;k<mm[j];++k){if(Manu[j][k].band >= band[i] && Manu[j][k].price < minp)minp = Manu[j][k].price;}if(minp == 0xffff){flag = true;break;}sum += minp;}if(!flag && ((band[i]*1.0)/sum>maxBP) )maxBP = band[i]*1.0/sum;}printf("%.3f\n",maxBP);n--;}return 0;}
之前写的是一个回溯版本的,后来为了更快改成循环了,貌似就快了40MS..在博客上看到 别人写的简略代码,差距很大。                                             
0 0