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 }

 

转载于:https://www.cnblogs.com/yongze103/archive/2010/04/28/1723259.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值