zoukankan      html  css  js  c++  java
  • 【NOIP2012】国王游戏

    Description

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

    国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

    Input

    第一行包含一个整数 n,表示大臣的人数。

    第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

    接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

    Output

    输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的

    金币数。

    Sample Input

    3

    1 1

    2 3

    7 4

    4 6

    Sample Output

    2

    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。

    题解

    将大臣手上数字的乘积升序排序 , 就是最优排队方案

    证明:邻项交换

    king | (a1,b1) (a2,b2)

    如果 king * a1 /b2 > king * a2 /b1 ==> a1 * b1 > a2 * b2

    那么交换1和2,可以使最大值更小(最大值并不一定是最后一个大臣 , 只是说明相邻两个大臣是否需要交换) 

    比较乘积的时候,如果相等,就比较右手上的数,小的放前面。

    再加上一个***的高精度。。。

    然后高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反高精度千万不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反不要存反

    然后我再也不想写高精度了

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    struct Chancellor
    {
        int l,r,m;
    }c[1010];
    int ans,len,f,maxxlen;
    int a[10000],a2[10000],d[10000],maxx[10000];
    char str[10000];
    int cmp(const Chancellor &a,const Chancellor &b)
    {
        if (a.m==b.m) return a.r<b.r;
        return a.m < b.m;
    }
    
    void cheng(int a[],int b)
    {
        memset(d,0,sizeof(d));
        for(int i=1;i<=len;i++) d[i]=a[i]*b;
        for (int i=1;i<=len;i++)
            if (d[i]/10){
                d[i+1]+=d[i]/10;
                d[i]%=10;
            }
        while (d[len+1]) len++;
        while (d[len]/10){
            d[len+1]+=d[len]/10;
            d[len]%=10;
            len++;
        }
        for (int i=1;i<=len;i++) a[i]=d[i];
    }
    
    void chu(int a[],int b)
    {
        memset(d,0,sizeof(d)); 
        int x=0;
        for(int i=1;i<=len;i++)
        {
            d[i]=(a[i]+x*10)/b;
            x=(a[i]+x*10)%b;
        }
        int pd=0;
        for (int i=1;i<=len;i++) if (d[i]){
            pd=1;break;
        }
        if (pd)
        {
            int i=1;
            for(;d[i]==0;i++);
            f=i;
            for (;i<=len;i++){
                if (d[i]>maxx[i]&&len-f+1==maxxlen || len-f+1>maxxlen){
                    for (int j=f;j<=len;j++) maxx[j]=d[j];
                    maxxlen=len-f+1;
                    break;
                }
                if (maxxlen>len-f+1 ||d[i]<maxx[i]) break;
            }
        }
    }
    int main()
    {
        int n;
        cin>>n;
        for (int i=0;i<=n;i++)
        {
            cin>>c[i].l>>c[i].r;
            c[i].m=c[i].l * c[i].r;
        }
        sort(c+1,c+n+1,cmp);
        for(int i=0;c[0].l;i++){
            str[i]=c[0].l%10+'0';
            c[0].l/=10;
        }
        len=strlen(str);
        for (int i=1;i<=len;i++) a[i]=str[i-1]-'0';
        for (int i=1;i<=len;i++) a2[i]=str[len-i]-'0';
        for (int i=1;i<=n;i++)
        {
            chu(a2,c[i].r);
            cheng(a,c[i].l);
            for (int j=1;j<=len;j++) a2[j] = a[len-j+1];
        }
        for (int i=f;i<=maxxlen+f-1;i++) cout<<maxx[i];
        return 0;
    }
  • 相关阅读:
    使用Nodejs+mongodb开发地图瓦片服务器
    深入浅出ghostbuster剖析NodeJS与PhantomJS的通讯机制
    Hibernate查询出现java.lang.IllegalArgumentException异常解决方法
    tilecache2.11在windows apache2.22安装部署
    OpenLayers调用ArcGIS Server发布的WFS服务
    无法启动ArcSDE服务
    AndroidManifest修改重打包全过程
    Java正确转换html编码
    pip 异常问题
    python 从数据库取回来的数据中文显示为乱码
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5223607.html
Copyright © 2011-2022 走看看