如果说这道题作为一道贪心的话其实并不难,但是高精确实烦人(像我这种蒟蒻,看了模板也得想好久)
其实这里只用到了高精乘低精,高精除以低精,要是高精除以高精就完蛋惹;
主要是想学习一下高精而已,加油吧!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
struct hyq{
int l,r;
}c[1010];
int res[51000];
char a1[30010];
int ans[30010],anss[30010],ansss[30010];
int b1,sl,maxx,ll;
int maxn[10010];
bool cmp(hyq a,hyq b){
return a.l*a.r<b.l*b.r;
}
void mul(int x){
for(int i=1;i<=sl;i++){
res[i]*=x;
}
for(int i=1;i<=sl;i++){
res[i+1]+=res[i]/10;
res[i]%=10;
}
sl++;
while(res[sl]>9){
res[sl+1]+=res[sl]/10;
res[sl]=res[sl]%10;
sl++;
}
while(res[sl]==0&&sl>1) sl--;
}
void chu(int ss){
memset(anss,0,sizeof(anss));
memset(ansss,0,sizeof(ansss));
memset(ans,0,sizeof(ans));
ll=sl;
for(int i=1;i<=ll;i++) anss[ll-i+1]=res[i];
long long sx=0;
for(int i=1;i<=ll;i++){
ansss[i]=(sx*10+anss[i])/ss;
sx=(sx*10+anss[i])%ss;
}
for(int i=1;i<=ll;i++){
ans[i]=ansss[ll-i+1];
}
while(ans[ll]==0&&ll>1){
ll--;
}
}
void max(){
if(ll>maxx){
maxx=ll;
for(int i=ll;i>=1;i--){
maxn[i]=ans[i];
}
}
else if(ll==maxx){
for(int i=ll;i>=1;i--){
if(ans[i]>maxn[i]){
maxx=ll;
for(int j=i;j>=1;j--){
maxn[j]=ans[j];
}
break;
}
if(ans[i]<maxn[i]) break;
}
}
}
int main(){
int n;
cin>>n;
cin>>a1;
cin>>b1;
sl=strlen(a1);
for(int i=0;i<sl;i++) res[sl-i]=a1[i]-'0';
for(int i=1;i<=n;i++){
cin>>c[i].l>>c[i].r;
}
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++){
if(i!=1) mul(c[i-1].l);
chu(c[i].r);
max();
}
for(int i=maxx;i>=1;i--) cout<<maxn[i];
}