您的位置:首页 > 其它

poj 1018 Communication System

2015-06-21 23:32 483 查看
方法一:枚举 需要求出每一组设备中带宽的最小值中的最小值minb,每组设备中宽带的最大值中的最小值,在遍历带宽i的时候,需要求出价格和的最小值

#include<string.h>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
#define MAXSIZE 100
using namespace std;
const int INF = 1<<30;
int t = 0, n = 0;
int p[101][101], b[101][101];
int minn = INF, maxn = 0;
int from = 0, to = 0;
int used[101];
double maxans = 0;
int num[101];
int main()
{
//freopen("data_1018.txt","r",stdin);
scanf("%d", &t);
from = INF;
to = INF;
while(t--)
{
memset(used, 0, sizeof(used));
from = INF;
to = INF;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
minn = INF;
maxn = 0;
scanf("%d", &num[i]);
for (int j = 0; j < num[i]; j++)
{
scanf("%d%d", &b[i][j], &p[i][j]);
used[b[i][j]] = 1;
if (minn > b[i][j])
{
minn = b[i][j];
}
if (maxn < b[i][j])
{
maxn = b[i][j];
}
}
if (from > minn)
{
from = minn;
}
if (to > maxn)
{
to = maxn;
}
}
from = minn;
to = maxn;
int psum = 0;
int minp = INF;
for (int i = from ; i <= to; i++)
{
maxans = 0;
if (used[i])
{
psum = 0;
for (int j = 0; j < n; j++)
{
minp = INF;
for (int k = 0; k < num[j]; k++)
{
if (b[j][k] >= i)
{
if (minp > p[j][k])
{
minp = p[j][k];
}
}

}
psum += minp;
}
if (maxans < i * 1.0 / psum)
{
maxans = i * 1.0 / psum;
}
}
}
printf("%.3lf\n", maxans);
}
return 0;
}


方法二:dp做法,dp[i][j] = max (dp[i][j], dp[i - 1][j] + p[i][j]);

#include<string.h>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
#define MAXSIZE 100
using namespace std;
const int INF = 1<<30;
int t = 0, n = 0;
int dp[1001][1001];
int b[101][101], p[101][101], num[101];
int main()
{
//freopen("data_1018.txt","r",stdin);
scanf("%d", &t);
int maxb = 0;
while(t--)
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
for (int j = 1; j <= num[i]; j++)
{
scanf("%d%d", &b[i][j], &p[i][j]);
if (maxb < b[i][j])
{
maxb = b[i][j];
}
}
}
memset(dp,0x3f,sizeof(dp));
for (int i = 0; i <= maxb; i++)
{
dp[0][i] = 0;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= num[i]; j++)
{
for (int k = 1; k <= b[i][j]; k++)
{
dp[i][k] = min (dp[i][k], dp[i - 1][k] + p[i][j]);
}
}
}
double maxans = 0;
for (int i = 1; i <= maxb; i++)
{
maxans = max (maxans, 1.0 * i / dp
[i]);
}
printf("%.3f\n", maxans);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp