您的位置:首页 > 其它

POJ 1018 Communication System(DP)

2016-03-07 09:32 267 查看
讲道理,在没有给出每个装置的B范围不应该用这样的方法过题的,最正确的想法应该是枚举

#include<iostream>
#include<cstdio>
#include<set>
#include<string>
#include<string.h>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<cctype>
#include<algorithm>
#include<sstream>
#include<utility>
#include<cmath>
#include<functional>
#define mt(a) memset(a,0,sizeof (a))
#define fl(a,b,c) fill(a,b,c)
#define SWAP(a,b,t) (t=a,a=b,b=t)

#define inf 1000000000+7

using namespace std;
typedef long long ll;

int dp[120][2000];

int main()
{
int T;
cin >> T;
while (T--)
{
int n;
int bb[120], pp[120];
cin >> n;
int maxx = -1;
for (int i = 0; i < 120; i++)
fill(dp[i], dp[i] + 2000, inf);
for (int i = 1; i <= n; i++)
{
int m;
cin >> m;
for (int j = 0; j < m; j++)
{
scanf("%d %d", &bb[j], &pp[j]);
maxx = max(maxx, bb[j]);
}
if (i == 1)
{
for (int k = 0; k < m; k++)
dp[1][bb[k]] = pp[k];
continue;
}
else
{
for (int j = 0; j <= maxx; j++)
{
if (dp[i - 1][j] != inf)
{
for (int k = 0; k < m; k++)
{
if (dp[i - 1][j] + pp[k] < dp[i][min(j, bb[k])])
dp[i][min(j, bb[k])] = dp[i - 1][j] + pp[k];
}
}
}
}
}
double ans = 0;
for (int i = 0; i <=maxx; i++)
{
if (dp
[i]!=inf)
ans = max(i*1.0 / dp
[i],ans);
}
printf("%.3f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: