時空隧道
分析:
感覺這題的貪心比較不合常理,但是推一推還是可以推出來的…..主要是高精度難寫….
代碼如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=+;
int n,tmp[maxn],a[maxn],aa[maxn],MAX[maxn],f,maxlen,len;
char str[maxn];
struct M{
int x,y,pro;
friend bool operator < (M a,M b){
if(a.pro==b.pro)
return a.y<b.y;
return a.pro<b.pro;
}
}s[maxn];
inline void mul(int a[],int b){
memset(tmp,,sizeof(tmp));
for(int i=;i<=len;i++)
tmp[i]=a[i]*b;
for(int i=;i<=len;i++)
if(tmp[i]/)
tmp[i+]+=tmp[i]/,tmp[i]%=;
while(tmp[len+])
len++;
while(tmp[len]/)
tmp[len+]+=tmp[len]/,tmp[len]%=,len++;
for(int i=;i<=len;i++)
a[i]=tmp[i];
}
inline void div(int a[],int b){
memset(tmp,,sizeof(tmp));
int x=;
for(int i=;i<=len;i++)
tmp[i]=(a[i]+x*)/b,x=(a[i]+x*)%b;
int pd=;
for(int i=;i<=len;i++)
if(tmp[i]){
pd=;
break;
}
if(pd){
int i=;
for(;tmp[i]==;i++);
f=i;
for(;i<=len;i++){
if((tmp[i]>MAX[i]&&len-f+==maxlen)||len-f+>maxlen){
for(int j=f;j<=len;j++)
MAX[j]=tmp[j];
maxlen=len-f+;
break;
}
if(maxlen>len-f+||tmp[i]<MAX[i])
break;
}
}
}
signed main(void){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&s[i].x,&s[i].y),s[i].pro=s[i].x*s[i].y;
sort(s+,s+n+);
for(int i=;s[].x;i++)
str[i]=s[].x%+'0',s[].x/=;
len=strlen(str);
for(int i=;i<=len;i++)
a[i]=str[i-]-'0';
for(int i=;i<=len;i++)
aa[i]=str[len-i]-'0';
for(int i=;i<=n;i++){
div(aa,s[i].y),mul(a,s[i].x);
for(int j=;j<=len;j++)
aa[j]=a[len-j+];
}
for(int i=f;i<=maxlen+f-;i++)
cout<<MAX[i];
cout<<endl;
return ;
}
by >_< neighthorn