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 }

 

 

posted @ 2013-08-15 18:08  小の泽  阅读(233)  评论(0编辑  收藏  举报