POJ 1018(dp Or 枚举)
来源:互联网 发布:高中数学补课网络 编辑:程序博客网 时间:2024/06/06 10:43
Communication System
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 23738 Accepted: 8437
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.
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 33 100 25 150 35 80 252 120 80 155 402 100 100 120 110
Sample Output
0.649
Source
Tehran 2002, First Iran Nationwide Internet Programming Contest
[Submit] [Go Back] [Status] [Discuss]
dp做法,dp[i][j]表示前i个物品最小带宽为j所需的最小费用。
/************************************************************************* > File Name: xiaozhao.cpp > Author: acvcla > QQ:acvcla@gmail.com > Mail: acvcla@gmail.com > Created Time: 2014年12月27日 星期一 22时34分13秒 *************************************************************************/ #include<cstdio>#include<iostream>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<cstdlib>#include<vector>#include<set>#include<map>#include<stack>using namespace std;typedef long long ll;typedef pair<int,int>pii;const int maxn=1e2+10;const int maxv=1e3+10;int dp[maxn][maxv],b[maxn],p[maxn];int main(){int T,n,m;scanf("%d",&T);while(T--) {scanf("%d",&n);memset(dp,0,sizeof dp);int maxb=0;for(int i=0;i<n;++i) {scanf("%d",&m);for(int j=0;j<m;++j){scanf("%d%d",&b[j],&p[j]);maxb=max(maxb,b[j]);}if(i==0) {for(int j=0;j<m;++j) {if(!dp[0][b[j]])dp[0][b[j]]=p[j];else dp[0][b[j]]=min(dp[0][b[j]],p[j]);}continue;}for(int j=1;j<=maxb;j++) if(dp[i-1][j]) {for(int k=0;k<m;k++) {int minb=min(b[k],j);if(!dp[i][minb])dp[i][minb]=dp[i-1][j]+p[k];else dp[i][minb]=min(dp[i][minb],dp[i-1][j]+p[k]);}}}double ans=0;for(int i=1;i<=maxb;i++) {if(!dp[n-1][i])continue;ans=max(ans,1.0*i/dp[n-1][i]);}printf("%.3f\n", ans);}return 0;}
枚举居然比dp更快。。。,枚举最小带宽。
/************************************************************************* > File Name: xiaozhao.cpp > Author: acvcla > QQ:acvcla@gmail.com > Mail: acvcla@gmail.com > Created Time: 2014年12月27日 星期一 22时34分13秒 *************************************************************************/ #include<cstdio>#include<iostream>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<cstdlib>#include<vector>#include<set>#include<map>#include<stack>using namespace std;typedef long long ll;typedef pair<int,int>pii;const int maxn=1e4+10;const int inf=0x3f3f3f3f;vector<pii>communication[maxn];vector<int> v;double work(int x,int n){int b=inf;double p=0;for(int i=0;i<n;i++) {int ch=-1;for(int j=0;j<communication[i].size();++j) if(communication[i][j].first>=x) {if(ch==-1||communication[i][j].second<communication[i][ch].second||(communication[i][j].second==communication[i][ch].second&&communication[i][j].first>communication[i][ch].first)){ch=j;}}if(ch==-1)return -1.0;b=min(b,communication[i][ch].first);p+=communication[i][ch].second;}return b/p;}double solve(int n){sort(v.begin(), v.end());unique(v.begin(), v.end());int L=0,R=v.size();double ans=-3.0,p=0;for(int i=0;i<v.size();++i) {p=work(v[i],n);if(p<=0)return ans;ans=max(p,ans);}return ans;}int main(){int T,n,m;scanf("%d",&T);while(T--) {scanf("%d",&n);for(int i=0;i<n;i++)communication[i].clear();v.clear();for(int i=0;i<n;i++) {scanf("%d",&m);int b,p;while(m--) {scanf("%d%d",&b,&p);v.push_back(b);communication[i].push_back(make_pair(b,p));}}printf("%.3f\n", solve(n));}return 0;}
0 0
- POJ 1018(dp Or 枚举)
- poj 1018 dp\枚举+剪枝 (选择带宽)
- POJ 1178 - Camelot (枚举+dp : floyd)
- POJ 1178 Camelot(DP + 枚举)
- POJ:1050(枚举 + DP)
- HDU Untitled(状压DP OR dfs枚举子集)
- hihocoder 1326 dp OR 思维+枚举
- POJ 3671 DP or 乱搞
- POJ 2586 - 贪心 or DP
- poj 3140 Contestants Division(树形dp? dfs计数+枚举)
- poj 3977 Subset(折半枚举+状压dp)
- (POJ 1054)The Troublesome Frog <暴力枚举+剪枝 || DP>
- poj 3267 The Cow Lexicon(枚举+DP) @
- poj 1088 dp记忆化搜索状态( or dfs)
- POJ 1321 棋盘问题(暴力dfs or DP)
- POJ 1655 (树dp or 树重心)
- POJ 2955 Brackets (DP Or 记忆化搜索 总结)
- POJ 1018(dp)
- EF6 在原有数据库中使用 CodeFirst 总复习(五、生成发帖页面)
- 一人匀速行驶,每几分钟后面来一辆,每一分钟前面来一辆
- 架构师之路--一个四年JAVA程序员的工作经历
- 数字图像处理学习笔记(1.3)---位图的读写、几何变换、傅里叶变换、直方图均衡
- 自适应网页设计(Responsive Web Design)
- POJ 1018(dp Or 枚举)
- 深入浅出解析mssql在高频,高并发访问时键查找死锁问题
- VC2010编译源代码编辑控件scintilla
- 回顾2014、展望2015
- 2014年终总结
- 新版iTunes Connect提交更新版本
- ov9650 的调试 来自网络
- 写在新年的门槛上
- java集合类源码分析一:HashMap