标签:des style class blog c code
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22500 | Accepted: 8008 |
Description
Input
Output
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
题目大意:
有T组测试数据,每组1个n,表示n行,接下来n行,每行一个m,表示有m个管道,每个管道有流量和费用,最后求从n行中,每行选择1个管道,要求 B/P最大 ,B表示所选的那个方案中n个管道的最小的那个的流量,P表示n个管道费用和。
解题思路:
朴素的动态规划,dp[i]记录,当前B为i的P,也就是流量的最小费用和。实现可以利用队列代替滚动数组。
解题代码:
#include <iostream> #include <cstdio> #include <queue> #include <iomanip> using namespace std; const int maxn=1100; const int inf=0x3f3f3f3f; int dp[maxn]; struct node{ int flow,sum; node(int flow0=0,int sum0=0){ flow=flow0,sum=sum0; } }; void solve(){ queue <node> q; q.push(node(inf,0)); int n,m,flow,price; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&m); for(int i=0;i<maxn;i++) dp[i]=inf; while(m-- >0){ scanf("%d%d",&flow,&price); int qsize=q.size(); while(qsize-- >0){ node s=q.front(); q.pop(); if(s.flow<flow){ if(s.sum+price<dp[s.flow]) dp[s.flow]=s.sum+price; }else{ if(s.sum+price<dp[flow]) dp[flow]=s.sum+price; } q.push(s); } } while(!q.empty()) q.pop(); for(int i=0;i<maxn;i++){ if(dp[i]<inf) q.push(node(i,dp[i])); } } double ans=0; while(!q.empty()){ node s=q.front(); q.pop(); if(double(s.flow)/double(s.sum) > ans) ans= double(s.flow)/double(s.sum) ; } cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans<<endl; } int main(){ int t; scanf("%d",&t); while(t-- >0){ solve(); } return 0; }
POJ 1018 Communication System (动态规划),布布扣,bubuko.com
POJ 1018 Communication System (动态规划)
标签:des style class blog c code
原文地址:http://blog.csdn.net/a1061747415/article/details/26887425