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;
}