标签: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