[noip2012]国王游戏 题解

35 篇文章 0 订阅
20 篇文章 0 订阅

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

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

然后,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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值