poj 1018 Communication System
题目:
http://poj.org/problem?id=1018
首先,把所有元素按照带宽从小到大排序,然后枚举每一个带宽,并把它当做所选带宽中的最小值。
源代码:
1 #include <iostream> 2 #include<cstring> 3 #include<stdio.h> 4 #include<algorithm> 5 #include<math.h> 6 #define INF 100000000 7 using namespace std; 8 typedef struct{ 9 int group; 10 double b,p; 11 }device; 12 device de[10010]; 13 int num[110],re[110]; 14 double mini[110]; 15 int cmp(const void * x,const void * y){ 16 return((*(device *)y).b>(*(device *)x).b)?-1:1; 17 } 18 19 int main() 20 { 21 int t,ok; 22 double min_b; 23 double sum; 24 scanf("%d",&t); 25 while(t--){ 26 int n; //n组设备 27 scanf("%d",&n); 28 int count=0; 29 double ans=0; 30 for(int i=1;i<=n;i++){ 31 scanf("%d",&num[i]); //记录每组设备有多少个 32 mini[i]=INF; //记录每组满足情况的最小价格 33 for(int j=1;j<=num[i];j++){ 34 double temp_1,temp_2; 35 scanf("%lf %lf",&temp_1,&temp_2); 36 de[count].group=i; //第几组 37 de[count].b=temp_1; //带宽 38 de[count++].p=temp_2; //价格 39 } 40 } 41 int len=count; 42 qsort(de,len,sizeof(device),cmp); 43 for(int i=0;i<len;i++){ 44 min_b=de[i].b; //最小的带宽 45 memset(re,0,sizeof(re)); 46 sum=0; 47 ok=1; //每一组都有满足情况的 48 re[de[i].group]=1; 49 for(int m=1;m<=n;m++) 50 mini[m]=INF; 51 mini[de[i].group]=de[i].p; 52 for(int j=1;j<len;j++){ 53 if(de[j].group!=de[i].group&&de[j].b>=min_b&&de[j].p<mini[de[j].group]) { 54 re[de[j].group]=1; 55 mini[de[j].group]=de[j].p; //记录每一组价格最小值 56 } 57 } 58 for(int k=1;k<=n;k++){ 59 sum+=mini[k]; 60 if(re[k]==0) { 61 ok=0; 62 sum=-1; 63 break; 64 } 65 } 66 if(ok==1&&(min_b/sum)>ans){ 67 ans=min_b/sum; 68 } 69 if(ok==0) break; 70 } 71 double temp=ans*1000+0.5; 72 if(temp-floor(temp)<0) ans+=0.001; 73 printf("%.3lf\n",ans); 74 } 75 return 0; 76 }