Communication System--ZOJ 1409

1、题目类型:贪心、枚举。

2、解题思路:(1)对于每个 device 的多种选择,按照其 prices 从小到大排序;(2)遍历所有 device 中的每一种选择,寻找符合条件的最小B/P。

3、注意事项:注意STL结构体压栈;注意实数精度输出;注意遍历某种情况时,其他 device 不满足的情况。

3、实现方法:

1 #include <iostream>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5
6 typedef struct{
7 int B;
8 int P;
9 }Device;
10
11 vector< vector<Device> > devices;
12
13 bool Cmp(const Device &dev1,const Device &dev2)
14 {
15 return dev1.P<dev2.P;
16 }
17
18 //选择第row个设备的第col种情况
19 double MaxBP(int row,int col)
20 {
21 int i,j;
22 int minBandwidth=devices[row][col].B;
23 int n=devices.size();
24 double sum=devices[row][col].P;
25 for(i=0;i<n;i++)
26 {
27 if(i==row) continue;
28 int m=devices[i].size();
29 for (j=0;j<m;j++)
30 {
31 if(devices[i][j].B >= minBandwidth)
32 {
33 sum += devices[i][j].P;
34 break;
35 }
36 //devices[i]中没有找到
37 if( j==m-1 )
38 return 0;
39 }
40 }
41 return minBandwidth/sum;
42 }
43
44 double Search()
45 {
46 double max = 0;
47 int i,j;
48 int n=devices.size();
49 for(i=0;i<n;i++)
50 {
51 int m=devices[i].size();
52 for(j=0;j<m;j++)
53 {
54 double bp=MaxBP(i,j);
55 if( bp>max )
56 max=bp;
57 }
58 }
59 return max;
60 }
61
62 int main()
63 {
64 int i,j,k,n,m,t;
65 cin>>t;
66 for(i=0;i<t;i++)
67 {
68 devices.clear();
69 cin >> n;
70 for (j=0;j<n;j++)
71 {
72 vector<Device> v;
73 cin>>m;
74 for(k=0;k<m;k++)
75 {
76 Device d;
77 cin >> d.B;
78 cin >> d.P;
79 v.push_back(d);
80 }
81 sort(v.begin(),v.end(),Cmp);
82 devices.push_back(v);
83 }
84 cout.setf (ios::fixed);
85 cout.precision (3);
86 cout<<Search()<<endl;
87 }
88 return 0;
89 }

 

posted @ 2010-04-28 20:35  勇泽  阅读(421)  评论(0编辑  收藏  举报