原题:P1080 国王游戏
90pts RE
Record
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
struct P{
int a,b;
}p[1025];
bool cmp(P a,P b){
return a.a*a.b<=b.a*b.b;
}
struct N{
int k,num[100025];
}tmp,ans;
N operator * (N a,int b){
N x;
memset(x.num,0,sizeof(x.num));
for(int i=1;i<=a.k;i++)x.num[i]=a.num[i]*b;
for(int i=1;i<=min(a.k+12,100000);i++){
x.num[i+1]+=x.num[i]/10;
x.num[i]%=10;
if(x.num[i])x.k=i;
}
return x;
}
N operator / (N a,int b){
N x;
x.k=1;
memset(x.num,0,sizeof(x.num));
for(int i=1;i<=a.k;i++)x.num[i]=a.num[i];
for(int i=a.k;i>=1;i--){
x.num[i-1]+=x.num[i]%b*10;
x.num[i]/=b;
}
for(int i=1;i<=a.k;i++)if(x.num[i])x.k=i;
x.num[0]=0;
return x;
}
bool operator < (N a,N b){
if(a.k==b.k){
for(int i=a.k;i>=1;i--)if(a.num[i]!=b.num[i])return a.num[i]<b.num[i];
return false;
}
return a.k<b.k;
}
int main(){
ans.k=tmp.k=1;
tmp.num[1]=1;
scanf("%d",&n);
for(int i=0;i<=n;i++)scanf("%d %d",&p[i].a,&p[i].b);
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
tmp=tmp*p[i-1].a;
if(p[i].b==1)ans=max(ans,tmp);
else ans=max(ans,tmp/p[i].b);
}
for(int i=ans.k;i>=1;i--)printf("%d",ans.num[i]);
return 0;
}