poj1018(枚举)

来源:互联网 发布:极度恐慌网络 编辑:程序博客网 时间:2024/05/29 02:49

从DP题集中找的这道题,然后却是用搜索做的,但是在poj上一直超时,优化一直也没有好方法优化,看别人说暴力就可以过……让我很是郁闷╮(╯_╰)╭

搜索做的:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct NODE{int b,p,id;}node[110][110];int min(int a,int b){return a>b?b:a;}int i,j,k,n,nn,m[110];float MAX=0;float bp;NODE x;void dfs(int i,int b,int p){     bp=((float)b/(float)p);     if(i==nn+1&&MAX<bp) MAX=bp;     for(int ii=1;ii<=m[i];++ii)     {          int bb=min(node[i][ii].b,b);          p+=node[i][ii].p;          dfs(i+1,bb,p);          p-=node[i][ii].p;     }}int main(){scanf("%d",&n);while(n--)     {          scanf("%d",&nn);          for(i=1;i<=nn;++i)          {               scanf("%d",&m[i]);               for(j=1;j<=m[i];++j)                    scanf("%d %d",&node[i][j].b,&node[i][j].p);for(j=1;j<m[i];++j){for(k=j+1;k<=m[i];++k){if(node[i][j].b>node[i][j].b) {x=node[i][j];node[i][j]=node[i][k];node[i][k]=x;}else if(node[i][j].p>node[i][k].p) {x=node[i][j];node[i][j]=node[i][k];node[i][k]=x;}}}          }          MAX=0;          dfs(1,10000000,0);          printf("%.3f\n",MAX);     }return 0;}

直接暴力枚举的……:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct NODE{int b,p,id;}node[110][110];int min(int a,int b){return a>b?b:a;}int max(int a,int b){return a>b?a:b;}float max(float a,float b){return a>b?a:b;}int maxb[110],minb[110];int i,j,k,n,nn,m[110];int s,e;int find(int b){int ret=0;for(int i=1;i<=nn;++i){int minp=0x3f3f3f3f;for(int j=1;j<=m[i];++j)if(node[i][j].b>=b) minp=min(minp,node[i][j].p);ret+=minp;}return ret;}void work(){for(int i=1;i<=nn;++i){minb[i]=maxb[i]=node[i][1].b;for(int j=2;j<=m[i];++j){maxb[i]=max(maxb[i],node[i][j].b);minb[i]=min(minb[i],node[i][j].b);}}s=minb[1];e=maxb[1];for(int i=2;i<=nn;++i){s=min(s,minb[i]);e=min(e,maxb[i]);}float ans=0;for(int i=s;i<=e;++i){int d=find(i);ans=max(ans,i*1.0/d);}printf("%.3f\n",ans);}int main(){scanf("%d",&n);while(n--)     {          scanf("%d",&nn);          for(i=1;i<=nn;++i)          {               scanf("%d",&m[i]);               for(j=1;j<=m[i];++j)                    scanf("%d%d",&node[i][j].b,&node[i][j].p);          }          work();     }return 0;}



0 0
原创粉丝点击