题解bytianmeng
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#include<fstream>
using namespace std;
int sum[50000],ans[50000],t[50000];//sum是每次到i这个人这里他左边所有人左手的乘积(排好序了的)
//ans是答案,t是一个临时数组,算一算每次sum除以右手的结果 ,并且与ans比比谁更大;
int n;
struct node{
int l,r,lr;
}pp[1009];//定义每个人,我这里将pp[0]算作国王;
bool cmp(node x,node y){
if(x.lr!=y.lr) return x.lr<y.lr;
return x.r<y.r;
} //排序中的比大小
void cheng(int x){
for(int i=1;i<=sum[0];i++){
sum[i]*=x;
}//因为是sum[i]里的数字是单精(因为买次都%了一下10),所以可以直接乘单精咯=。=
int i;
for(i=1;i<=sum[0];i++){
sum[i+1]+=sum[i]/10;
sum[i]%=10;//进位问题
if(i==sum[0] && sum[sum[0]+1]!=0) sum[0]++;//刚才高乘一直错就是在这里,写了一长串奇怪的东西。。清了清脑袋发现这里很容易,然后一串代码解决;
}
}
bool judge(){//判断t和ans谁大
for(int i=1;i<=t[0];i++){//为何比较要从i=1往后看下面solve就知道原因了,i才是最高位_(:зゝ∠)_
if(t[i]!=ans[i]){
return t[i]>ans[i];//巧妙的判断方法
}
}
}
void solve(int x){
int num=0,i=sum[0]+1,s=0;
memset(t,0,sizeof(t));//初始化
while(num<x){
--i;
num=num*10+sum[i];//模拟数学中的除法,这也是为什么一开始i=sum[0]+1了,从高位开始取数嘛
}
t[0]=i;//写个除法算式就看的懂了= =这个就是商的位数!
for(;i>=1;i--){
t[++s]=num/x; //注意这里,你先放在前面的t[1],t[2]...都是数字里最大的数哦,跟sum里面不一样!
num=num%x*10+sum[i-1];//继续算式模拟,算了数字之后把取mod的数*10再+下一位数,小学生都知道怎么算的除法
}
if(t[0]>ans[0] || t[0]==ans[0] && judge()){
for(int i=0;i<=t[0];i++)
ans[i]=t[i];//公婆要和我比一比,比就比,谁怕谁谁怕谁
}
}
int main(){
// freopen("fxxk.in","r",stdin);
// freopen("fxxk.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<=n;i++){
scanf("%d%d",&pp[i].l,&pp[i].r);
pp[i].lr=pp[i].l*pp[i].r;
}//cin;
sum[1]=pp[0].l;//左手乘积的第一个就是国王的左手咯。
sum[0]=1;//位数先假装是1。。反正到时候会搞好的
ans[1]=0;//答案的第一位假装是0
ans[0]=1;//答案的位数先设定为1
sort(pp+1,pp+n+1,cmp);//compare;
for(int i=1;i<=n;i++){
cheng(pp[i].l);
solve(pp[i].lr);
//过程
}
for(int i=1;i<=ans[0];i++)
i<ans[0]?printf("%d",ans[i]):printf("%d\n",ans[i]);//i是最高位别忘了哦。。
return 0;
}