您的位置:首页 > 其它

[noip2012]国王游戏 题解

2017-10-29 21:11 447 查看
显然,这样题一定是要排序的,如何拍呢。

我们先猜一猜,发现只要按照乘积大小来排序就好了。至于证明,我们这样想,如果只交换两个相邻的数,产生的影响只要它们两个数之间,然后讨论一下就可以了。

然后,60%数据保证答案小于10^9,说明什么,之后的数据要上高精度,好麻烦呀。

但其实还是可以写的,可以写在一个结构体内,但我好像不会233。就用的函数,貌似很丑,大家凑合看看。

#include<bits/stdc++.h>
using namespace std;
struct bigint{
int len;
int data[5005];
};
struct person{
int l,r,data;
bool operator < (const person &A)const
{
return data<A.data;
}
};person A[1005];
int n,a,b;
bigint tmp,ans,mx;
inline int cmp(bigint A,bigint B)
{
if(A.len>B.len)return 1;
if(B.len>A.len)return -1;
for(int i=A.len;i>=1;i--)
{
if(A.data[i]==B.data[i])continue;
if(A.data[i]>B.data[i])return 1;
if(A.data[i]<B.data[i])return -1;
}
return 0;
}
inline void create(bigint &A,int x)
{
A.len=0;
while(x)A.data[++A.len]=x%10,x/=10;
}
inline bigint multiply(bigint A,int b)
{
bigint ans;
ans.len=0;
memset(ans.data,0,sizeof(ans.data));
int x=0;
for(int i=1;i<=A.len;i++)
{
x=x+A.data[i]*b;
ans.data[++ans.len]=x%10;
x/=10;
}
while(x)ans.data[++ans.len]=x%10,x/=10;
return ans;
}
inline void reverse(bigint &A)
{
for(int i=1;i<=A.len/2;i++)swap(A.data[i],A.data[A.len-i+1]);
}
inline bigint divide(bigint A,int b)
{
reverse(A);
bigint tmp;
tmp.len=0;
memset(tmp.data,0,sizeof(tmp.data));
int x=0;
for(int i=1;i<=A.len;i++)
{
x=x*10+A.data[i];
tmp.data[++tmp.len]=x/b;
x%=b;
}
int st=1;
while(tmp.data[st]==0&&st<tmp.len)st++;
bigint ans;
ans.len=0;
memset(ans.data,0,sizeof(ans.data));
for(int i=st;i<=tmp.len;i++)
ans.data[++ans.len]=tmp.data[i];
reverse(ans);
return ans;
}
inline void write(bigint A)
{
for(int i=A.len;i>=1;i--)cout<<A.data[i];
cout<<endl;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d",&n);scanf("%d%d",&a,&b);
for(int i=1;i<=n;i++)scanf("%d%d",&A[i].l,&A[i].r),A[i].data=A[i].l*A[i].r;
sort(A+1,A+n+1);
create(tmp,a);
ans.len=1,ans.data[1]=0;
for(int i=1;i<=n;i++)
{
mx=divide(tmp,A[i].r);
if(cmp(mx,ans)==1)ans=mx;
tmp=multiply(tmp,A[i].l);
}
write(ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: