提交时间:2024-08-20 21:18:59
运行 ID: 173538
#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; }