Communication System(dp)
2015-08-19 15:03
309 查看
Communication System
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 25006 Accepted: 8925
Description
We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices. For each device, we are free to choose from several manufacturers. Same devices from two manufacturers differ in their maximum bandwidths and prices.
By overall bandwidth (B) we mean the minimum of the bandwidths of the chosen devices in the communication system and the total price (P) is the sum of the prices of all chosen devices. Our goal is to choose a manufacturer for each device to maximize B/P.
Input
The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by the input data for each test case. Each test case starts with a line containing a single integer n (1 ≤ n ≤ 100), the number of devices in the communication system, followed by n lines in the following format: the i-th line (1 ≤ i ≤ n) starts with mi (1 ≤ mi ≤ 100), the number of manufacturers for the i-th device, followed by mi pairs of positive integers in the same line, each indicating the bandwidth and the price of the device respectively, corresponding to a manufacturer.
Output
Your program should produce a single line for each test case containing a single number which is the maximum possible B/P for the test case. Round the numbers in the output to 3 digits after decimal point.
Sample Input
1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
Sample Output
0.649
Source
Tehran 2002, First Iran Nationwide Internet Programming Contest
以前做这道题的时候是用的贪心,不太明白,现在用Dp明白了;
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 25006 Accepted: 8925
Description
We have received an order from Pizoor Communications Inc. for a special communication system. The system consists of several devices. For each device, we are free to choose from several manufacturers. Same devices from two manufacturers differ in their maximum bandwidths and prices.
By overall bandwidth (B) we mean the minimum of the bandwidths of the chosen devices in the communication system and the total price (P) is the sum of the prices of all chosen devices. Our goal is to choose a manufacturer for each device to maximize B/P.
Input
The first line of the input file contains a single integer t (1 ≤ t ≤ 10), the number of test cases, followed by the input data for each test case. Each test case starts with a line containing a single integer n (1 ≤ n ≤ 100), the number of devices in the communication system, followed by n lines in the following format: the i-th line (1 ≤ i ≤ n) starts with mi (1 ≤ mi ≤ 100), the number of manufacturers for the i-th device, followed by mi pairs of positive integers in the same line, each indicating the bandwidth and the price of the device respectively, corresponding to a manufacturer.
Output
Your program should produce a single line for each test case containing a single number which is the maximum possible B/P for the test case. Round the numbers in the output to 3 digits after decimal point.
Sample Input
1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
Sample Output
0.649
Source
Tehran 2002, First Iran Nationwide Internet Programming Contest
以前做这道题的时候是用的贪心,不太明白,现在用Dp明白了;
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <map> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; typedef long long LL; const int MAX = 1e5+10; int Dp[120][1200];//买i件设备时,最小值为k时的花费 int main() { int n,T,m,b,p; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(Dp,INF,sizeof(Dp)); for(int i=0;i<=1200;i++)//当没有一件设备是,自然p为零 { Dp[0][i]=0; } for(int i=1;i<=n;i++) { scanf("%d",&m); for(int j=1;j<=m;j++) { scanf("%d %d",&b,&p); for(int k=0;k<1200;k++) { if(b<=k)//当买的b值比k值小时,说明在你买的设备中最小的为b,所以在买i-1件设备中花费+p与Dp[i][b]取小值 { Dp[i][b]=min(Dp[i-1][k]+p,Dp[i][b]); } else { Dp[i][k]=min(Dp[i][k],Dp[i-1][k]+p);//买的b值比k值大时,k是买的设备中的最小值,同理 } } } } double ans=0; for(int i=1;i<1200;i++) { if(Dp [i]!=INF) { if(ans<(i*1.0/Dp [i]))//遍历找出b/p的最大值 { ans=(i*1.0/Dp [i]); } } } printf("%.3f\n",ans); } return 0; }
相关文章推荐
- openwrt su : must be suid to work properly
- Azure REST API (2) Azure Storage
- 装 MSDE2000 后,1433 端口未监听的问题[整理转贴]
- 升级版控制台神兽
- hdu2018 dp
- Communication System(dp)
- android 第三方 Im
- 输入日期及提醒事件并输出
- 分享干货 码农必备各种API20
- ThinkPHP自动验证分析
- Java IO最详解
- PL/SQL语句学习之使用while、loop和for三种循环打印数字的1-10
- HDU 4710 Balls Rearrangement
- 2013阿里巴巴安全工程师笔试试题_复习使用
- [转]svn: E200030: sqlite[S11]: database disk image is malformed
- How to:如何让Installshield显示正确的软件所需空间--网友冰块先生贡献
- HDU 5396 Expression (数学期望+区间DP)
- 电脑问题--20140323 outlook邮件内链接打不开解决办法
- UINaviagtionBar 去除底部阴影的方法
- kali2 ssh