• 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;
    }
  • 相关阅读:
    Windows 服务的安装(1)
    C#编写window服务,一步一步(1)
    .net 读写记事本文件
    C#中POST数据和接收的几种方式(抛砖引玉)
    Newtonsoft.Json 通过 JObject 读取 json对像 超简单
    Winform读写App.config文件以及重启程序
    WebMatrix之WebMatrix.Data
    C#中方法的参数的四种类型
    zh-Hans vs.net 通过 管理nuget程序包下载简体中文语言包 zh-cn
    .net C# 图片转Base64 Base64转图片
  • 原文地址:https://www.cnblogs.com/xiaoqi7/p/5925422.html
Copyright © 2020-2023  润新知