题解 P1080 【国王游戏】
思路
太恶心了不想写,贴代码吧,高精+贪心
Code
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r;
}p[1010];
int n,m,la,lt,s[1010],T[1010],ans[1010],A,B;
int cmp(node a,node b)
{
if(a.l*a.r!=b.l*b.r)
return a.l*a.r<b.l*b.r;
return a.r<b.r;
}
int check_max()
{
int l1=1,l2=1;
while(!ans[l1]&&l1<=la)
{
l1++;
}
while(!T[l2]&&l2<=lt)
{
l2++;
}
if(la-l1+1>lt-l2+1)
{
return 0;
}
if(la-l1+1<lt-l2+1)
{
return 1;
}
while(l1<=la&&l2<=lt)
{
if(T[l2]>ans[l1])
{
return 1;
}
if(ans[l1]>T[l2])
{
return 0;
}
l1++;
l2++;
}
return 1;
}
void div(int x)
{
memset(T,0,sizeof(T));
lt=1;
while(m>0&&!s[m])
{
m--;
}
int d=0,flag=0;
for(int i=m;i>=1;i--)
{
d=d*100000+s[i];
T[++lt]=d/p[x].r;
if(!T[lt]&&!flag)
{
lt--;
}
else
{
flag=1;
}
d%=p[x].r;
}
}
void mul(int x)
{
for(int i=1;i<=m;i++)
{
s[i]*=p[x].l;
}
for(int i=1;i<=m;i++)
{
s[i+1]+=s[i]/100000;
s[i]%=100000;
}
if(s[m+1])
{
m++;
}
}
int main()
{
cin>>n;
cin>>A>>B;
for(int i=1;i<=n;i++)
{
cin>>p[i].l>>p[i].r;
}
sort(p+1,p+n+1,cmp);
m=1;
s[1]=A;
for(int i=1;i<=n;i++)
{
div(i);
if(check_max())
{
la=lt;
memcpy(ans,T,sizeof(T));
}
mul(i);
}
int now=0;
while(!ans[now]&&now<=la)
{
now++;
}
printf("%d",ans[now]);
now++;
for(;now<=la;now++)
{
if(0<=ans[now]&&ans[now]<=9) printf("0000%d",ans[now]);else
if(10<=ans[now]&&ans[now]<=99) printf("000%d",ans[now]);else
if(100<=ans[now]&&ans[now]<=999) printf("00%d",ans[now]);else
if(1000<=ans[now]&&ans[now]<=9999) printf("0%d",ans[now]);else
printf("%d",ans[now]);
}
}