zoukankan      html  css  js  c++  java
  • CODEVS 1198 国王游戏

    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。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdio>
    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;
        scanf("%d",&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;
    }
  • 相关阅读:
    作业三:代码规范、代码复审、PSP
    第二周学习进度表
    作业二:Github注册过程
    作业二:源程序版本管理软件和项目管理软件的优缺点
    作业二:四则运算
    408笔记--操作系统
    408笔记--计算机网络
    408笔记--计算机组成原理
    408笔记--数据结构
    2020 PAT秋季甲级考试(91分)-记
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5925422.html
Copyright © 2011-2022 走看看