poj 1018

来源:互联网 发布:中国域名管理机构 编辑:程序博客网 时间:2024/06/11 15:28

poj 1018

这道题数据处理量比较大,用的时候应避免动态经常申请内存,排序用qsort速度较好。


#include<assert.h>#include<iostream>#include<fstream>#include<string>#include<algorithm>#include<time.h>using namespace std; struct DEV{int B;int p;int id;friend int cmp(const void  *d1,const void  *d2){DEV* x=(DEV*)d1;          DEV* y=(DEV*)d2;           if((x->B)==(y->B))   //当带宽相等时         {            if((x->p)==(y->p))   //当价格也相等时              return (x->id)-(y->id);   //以编号为第三优先升序排序            return (x->p)-(y->p);   //以价格为第二优先升序排序        }      return (x->B)-(y->B);   //以带宽为第一优先升序排序         }};int min(const int* maxB,int n){int min=maxB[0];for(int i=1;i<n;i++){if(maxB[i]<min)min=maxB[i];}return min;}int main( ){ ifstream cin("input.txt"); int t;cin>>t;DEV* dev=new DEV[10001];int* maxB=new int[101];int* rem=new int[101];while(t--){double maxP=0;int n;int m=0;cin>>n;memset(maxB,0,sizeof(int)*n);for(int i=0;i<n;i++){int mi;cin>>mi;int b,p;while(mi--){  DEV d;  cin>>d.B>>d.p;  d.id=i;  if(d.B>maxB[i])  maxB[i]=d.B;  dev[m++]=d;}} qsort(dev,m,sizeof(DEV),cmp); for(int i=0;i<m-(n-1);i++){if(dev[i].B>min(maxB,n)){break;}memset(rem,-1,sizeof(int)*n);rem[dev[i].id]=dev[i].p;for(int j=i+1;j<m;j++){if(rem[dev[j].id]==-1){rem[dev[j].id]=dev[j].p;//count++;continue;}if(dev[j].p<rem[dev[j].id]){rem[dev[j].id]=dev[j].p;}}                     double sumP=0;    for(int i=0;i<n;i++)    {  // assert(rem[i]==-1);   sumP+=rem[i];    }sumP=(double)dev[i].B/sumP;if(sumP>maxP)maxP=sumP;}printf("%.3f\n",maxP);} delete maxB; delete dev; delete rem; return 0;}


原创粉丝点击