题解 P1080 【国王游戏】

luogu
AcWing

思路

太恶心了不想写,贴代码吧,高精+贪心

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]);
	}
}
posted @ 2019-07-27 09:34  G_A_TS  阅读(421)  评论(0编辑  收藏  举报