【解题报告】 [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;
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982