[noip2012]国王游戏 题解

显然,这样题一定是要排序的,如何拍呢。

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

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

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

#include
using namespace std;
struct bigint{
    int len;
    int data[5005];
};
struct person{
    int l,r,data;
    bool operator < (const person &A)const
    {
        return data1005];
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]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&&st0;
    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<cout<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;
} 

你可能感兴趣的:(刷题总结,贪心,技巧,高精度)