| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
DP题解#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define INF 999999
#define N 501
#define M 101
using namespace std;
int m[M],b[M][M],p[M][M],f[N];
int main()
{
int nn;
scanf("%d",&nn);
int n,Min,Max;
int k1,k2,km;
int min1,min2,MIN;
int c1,c2;
double ans;
while (nn--)
{
scanf("%d",&n);
Max=-INF;
Min=INF;
for (int i=1;i<=n;i++)
{
scanf("%d",&m[i]);
for (int j=1;j<=m[i];j++)
{
scanf("%d%d",&b[i][j],&p[i][j]);
if (b[i][j]<Min) Min=b[i][j];
if (b[i][j]>Max) Max=b[i][j];
}
}
for (int i=Min;i<=Max;i++) f[i]=INF;
for (int i=1;i<=m[1];i++)
if (f[b[1][i]]>p[1][i]) f[b[1][i]]=p[1][i];
for (int i=2;i<=n;i++)
for (int j=Min;j<=Max;j++)
{
min1=min2=INF;
k1=k2=0;
for (int k=1;k<=m[i];k++)
{
if(b[i][k]>=j&&p[i][k]<min1)
{
k1=k;
min1=p[i][k];
}
if(b[i][k]==j&&p[i][k]<min2)
{
k2=k;
min2=p[i][k];
}
}
if(k1&&f[j]!=INF) c1=f[j]+p[i][k1];
else c1=INF;
MIN=INF;
km=0;
for(int k=j+1;k<=Max;k++)
if(f[k]<MIN)
{
km=k;
MIN=f[k];
}
if(km&&k2) c2=f[km]+p[i][k2];
else c2=INF;
f[j]=c1<c2?c1:c2;
}
ans=0;
for (int i=Min;i<=Max;i++)
if ((f[i]!=INF)&&((double)i/f[i]>ans)) ans=(double)i/f[i];
printf("%.3lf\n",ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator