神奇的 2012 好多 神题。
这题就是 个 神奇的 贪心
这咋整 马神说:
考试时会证就证,不会就算了。
考完也不会证,贪心的策略就是 a.l*a.r 从小到大排序
嗯 但是很麻烦的是 mdzz
要写高精。。
#include<cstdio>
#include<algorithm>
#include<cstring>
//by mars_ch
using namespace std;
struct data
{
int l,r;
}p[10005];
char str[100005];
int len,pos,maxlen;
int a[50005],b[50005],d[50005],maxx[50005];
bool cmp(data a,data b)
{
return a.l*a.r<b.l*b.r;
}
void cheng(int c[],int x)
{
memset(d,0,sizeof(d));
for(int i=1;i<=len;i++)
{
d[i]=c[i]*x;
}
for(int i=1;i<=len;i++)
{
if(d[i]/10)
{
d[i+1]+=d[i]/10;
d[i]=d[i]%10;
}
}
while(d[len+1]) len++;
while(d[len]/10)
{
d[len+1]+=d[len]/10;
d[len]=d[len]%10;
len++;
}
for(int i=1;i<=len;i++)
{
c[i]=d[i];
}
}
void chu(int c[],int x)
{
memset(d,0,sizeof(d));
int m=0;
for(int i=1;i<=len;i++)
{
d[i]=(c[i]+m*10)/x;
m=(c[i]+m*10)%x;
}
int pd=0;
for(int i=1;i<=len;i++)
{
if(d[i])
{
pd=1;
break;
}
}
if(pd)
{
int i=1;
while(!d[i]) i++;
pos=i;
for(int j=pos;j<=len;j++)
{
if((d[j]>=maxx[j]&&maxlen==len-pos+1) || maxlen<len-pos+1)
{
for(int k=1;k<=len;k++)
{
maxx[k]=d[k];
}
maxlen=len-pos+1;
break;
}
if(maxlen>len-pos+1 || d[j]<maxx[j]) break;
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
}
sort(p+1,p+n+1,cmp);
while(p[0].l)
{
str[++len]=p[0].l%10+'0';
p[0].l/=10;
}
for(int i=1;i<=len;i++)
{
a[i]=str[i]-'0';
b[i]=str[len-i+1]-'0';
}
for(int i=1;i<=n;i++)
{
chu(b,p[i].r);
cheng(a,p[i].l);
for(int i=1;i<=len;i++)
{
b[i]=a[len-i+1];
}
}
int f=1;
while(maxx[f]==0) f++;
for(int i=f;i<=maxlen+f-1;i++)
{
printf("%d",maxx[i]);
}
return 0;
}