• Codevs 1198 国王游戏 2012年NOIP全国联赛提高组


    1198 国王游戏 2012年NOIP全国联赛提高组
    时间限制: 1 s
    空间限制: 128000 KB
    题目等级 : 钻石 Diamond
    题目描述 Description
    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
    国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。
    输入描述 Input Description
    第一行包含一个整数 n,表示大臣的人数。
    第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
    接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。
    输出描述 Output Description
    输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。
    样例输入 Sample Input
    3
    1 1
    2 3
    7 4
    4 6
    样例输出 Sample Output
    2
    数据范围及提示 Data Size & Hint
    【输入输出样例说明】
    按 1、2、3号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
    按 1、3、2这样排列队伍,获得奖赏最多的大臣所获得金币数为2;
    按 2、1、3这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
    按 2、3、1这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;
    按 3、1、2这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;
    按 3、2、1这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。
    因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。
    【数据范围】
    对于20%的数据,有1≤ n≤ 10,0 < a、b < 8;
    对于40%的数据,有1≤ n≤20,0 < a、b < 8;
    对于60%的数据,有1≤ n≤100;
    对于60%的数据,保证答案不超过 10^9;
    对于100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。
    分类标签 Tags
    大陆地区 NOIP全国联赛提高组 2012年

    /*
    由题意将Ai*Bi从小到大排序.
    非高精度60分. 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 1001
    #define LL long long
    using namespace std;
    LL a[MAXN],b[MAXN],c[MAXN],n;
    LL read(){
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void slove(){
        for(int i=1;i<=n;i++)
          for(int j=i+1;j<=n;j++){
            if(a[i]*b[i]>a[j]*b[j]){
                int tmp=a[i];a[i]=a[j];a[j]=tmp;
                tmp=b[i];b[i]=b[j];b[j]=tmp;
            }
          }
    }
    void slove2(){
        LL tot=1,ans=0;
        for(int i=1;i<=n;i++){
            tot*=a[i-1];
            ans=max(ans,tot/b[i]);
        }
        printf("%lld",ans);
    }
    int main(){
        n=read();
        a[0]=read(),b[0]=read();
        for(int i=1;i<=n;i++){
            a[i]=read();b[i]=read();
        }
        slove();
        slove2();
        return 0;
    }
    /*
    表示好久没写高精度了orz.
    ans记录∏a[i] 
    maxans记录当前最优值.
    tmp为临时数组记录ans/b[i].
    然后与maxans比较即可.
    */
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #define MAXN 1000001
    using namespace std;
    int a[MAXN],b[MAXN],n,sum[MAXN],ans[MAXN],maxans[MAXN],tmp[MAXN],l;
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void slove()
    {
        for(int i=1;i<=n;i++)
          for(int j=i+1;j<=n;j++)
            if(a[i]*b[i]>a[j]*b[j])
              {
                int tmp=a[i];a[i]=a[j];a[j]=tmp;
                tmp=b[i];b[i]=b[j];b[j]=tmp;
              }
    }
    void slovec(int x)
    {
        bool flag=false;
        for(int i=tmp[0];i>=2;i--)
          {
            tmp[i-1]+=(tmp[i]%x)*10;
            tmp[i]/=x;
            if(!flag){
                if(!tmp[i]) tmp[0]--;
                else flag=true;
            }
          }
        tmp[1]/=x;
    }
    void slovex(int x)
    {
        int t[MAXN];t[1]=0;
        for(int i=1;i<=l||(i>l&&t[i]);i++)
        {
            ans[i]*=x;
            ans[i]+=t[i];
            t[i+1]=ans[i]/10;
            ans[i]%=10;
            ans[0]=i;
        }
        l=ans[0];
        return ;
    }
    bool slovecmp(int aa[],int bb[])
    {
        if(aa[0]>bb[0])
        {
            for(int i=aa[0];i>=0;i--)
              maxans[i]=aa[i];
            return true;
        }
        else if(aa[0]<bb[0]) return false;
        else for(int i=ans[0];i>=1;i--)
            {
                if(aa[i]>bb[i])
                {
                    for(int j=0;j<=aa[0];j++)
                     maxans[j]=aa[j];
                     return true;
                }
                if(aa[i]==bb[i]) continue;
                return false;
            }
    }
    int main()
    {
        n=read();a[0]=read();b[0]=read();
        for(int i=1;i<=n;i++)
          a[i]=read(),b[i]=read();
        slove();
        ans[1]=a[0];ans[0]=l=1;maxans[0]=1;maxans[1]=-1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=tmp[0];j++) tmp[j]=0;tmp[0]=0; 
            for(int j=0;j<=ans[0];j++) tmp[j]=ans[j];
            slovec(b[i]);//*b[i]
            slovecmp(tmp,maxans);//cmp
            slovex(a[i]);// /a[i]
        }
        for(int i=maxans[0];i>=1;i--) printf("%d",maxans[i]);
        return 0;
    }
  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070795.html
Copyright © 2020-2023  润新知