Poj 1018 题解

来源:互联网 发布:js 数组 clear 编辑:程序博客网 时间:2024/06/10 18:46

这是一道简单的dp题。

首先想想,b/p最大,就是想让b最大,p最小。

状态定义f[i][j]=前i行最小最小值为j的最小价值p,这样用b/p才最大,最后一个个枚举。(自然保证最大)为什么一个个枚举可以呢 其实联系一下p想想就好了。

对了,还有的就是用c++ 提交

Code:

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int t,n;struct node{  int b[110],p[110];  int k;}Syt[110];int Maxx;void Input(){  Maxx=0;  scanf("%d",&n);  for(int i=1;i<=n;i++)  {scanf("%d",&Syt[i].k);for(int j=1;j<=Syt[i].k;j++){  scanf("%d%d",&Syt[i].b[j],&Syt[i].p[j]);  Maxx=max(Maxx,Syt[i].b[j]);}  }}int f[110][11000];double sum;void Solve(){  memset(f,63,sizeof(f));  for(int i=1;i<=Maxx;i++)    f[0][i]=0;  for(int i=1;i<=n;i++)    for(int j=1;j<=Syt[i].k;j++)  for(int k=1;k<=Syt[i].b[j];k++)    f[i][k]=min(f[i][k],f[i-1][k]+Syt[i].p[j]);  sum=0;  for(int i=1;i<=Maxx;i++)      sum=max(sum,1.0*i/f[n][i]);}void Output(){  printf("%.3lf\n",sum);}int main(){  freopen("a.in","r",stdin);  freopen("a.out","w",stdout);  int t;  scanf("%d",&t);  while(t--)  {    Input();    Solve();Output();  }  return 0;}


0 0
原创粉丝点击