【解题报告】 [NOIP2012]国王游戏

【解题报告】 [NOIP2012]国王游戏

题目:国王游戏

解题思路:

贪心

我们只需要将所有大臣左右手上的数的乘积从小到大进行排序,我们就得到了最优答案,但是这个代码要写高精度就是一个麻烦的东西,要好好写,话说近几年不出高精度的题目了,就怕今年要出。

AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=10005;
int n;
struct mini
{
	int a;
	int b;
}m[maxn];
bool cmp(mini x,mini y)
{
	return x.a*x.b<y.a*y.b;
}
int s[4005],len;
int ans[4005],ans_l(0); 
void mul(int x)
{
	int t(len);
	for(int i=1;i<=len;++i)
	s[i]*=x;
	for(int i=1;i<=len+5;++i)
	{
		if(s[i])
		t=i;
		s[i+1]+=s[i]/10;
		s[i]%=10;
	}
	len=t;
}
void cpy(int c[],int c_l)
{
	for(int i=1;i<=c_l;++i)
	ans[i]=c[i];
	ans_l=c_l;
}
void out(int s[],int l)
{
	for(int i=l;i>=1;--i)
	cout<<s[i];
	cout<<endl; 
}
void div(int x)
{
	int c[4005],l(-1);
	for(int i=1;i<=len;++i)
	c[i]=s[i];
	for(int i=len;i>=1;--i)
	{
		c[i-1]+=(c[i]%x)*10;
		c[i]/=x;
		if(c[i]&&l==-1)
		l=i;
	}
	if(ans_l==l)
	{
		bool flg(0);
		for(int i=l;i>=1;--i)
		{
			if(ans[i]<c[i])
			{
				flg=1;
				break;
			}
			else break;
		}
		if(flg)
		cpy(c,l);
	}
	if(ans_l<l)
	cpy(c,l);
}
int main()
{
	cin>>n;
	cin>>m[0].a>>m[0].b;
	for(int i=1;i<=n;++i)
	cin>>m[i].a>>m[i].b;
	sort(m+1,m+1+n,cmp);
	s[1]=1;len=1;
	mul(m[0].a);
	for(int i=1;i<=n;++i)
	div(m[i].b),mul(m[i].a);
	out(ans,ans_l);
	return 0;
}
posted @ 2019-08-10 09:56  wweiyi  阅读(215)  评论(0编辑  收藏  举报
js脚本