• codevs 1198 国王游戏


    题目描述 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。

    题解:最优方案就是按A * B递增排序的方案(注意使用高精度)。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 6005
    #define ll long long
    using namespace std;
    struct note
    {
        ll a,b,c;
    }a[1005];
    bool cmp(note x,note y)
    {
        return x.c<y.c;
    }
    int n,bz,i,j;
    int sum[N],ans[N],t[N];
    char s[5];
    void chu(int x)
    {
        int yu=0;
        memset(t,0,sizeof(t));
        for (j=sum[0];j>=1;j--)
        {
            yu=yu*10+sum[j];
            if(yu>=x)
            {
                if(!t[0]) t[0]=j;
                t[j]=yu/x;
                yu%=x;
            }
        }
    }
    void mx()
    {
        if(t[0]>ans[0]) memcpy(ans,t,sizeof(ans));
        else if(ans[0]==t[0])
        {
            for (j=ans[0];j>=1;j--)
                if(t[j]>ans[j])
                {
                    memcpy(ans,t,sizeof(ans));
                    return;
                } 
                else if(ans[j]<t[j]) return;
        }
    }
    void cheng(int x)
    {
        int t[N];
        memset(t,0,sizeof(t));
        for (j=1;j<=sum[0];j++)
        {
            t[j]=t[j]+sum[j]*x;
            t[j+1]+=t[j]/10;
            t[j]%=10;
        }
        for(t[0]=sum[0];t[t[0]+1];) 
          t[++t[0]+1]+=t[t[0]]/10,t[t[0]]%=10;
        memcpy(sum,t,sizeof(sum));
    }
    int main()
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        for (i=strlen(s+1);i>=1;i--) 
          sum[++sum[0]]=s[i]-'0';
        scanf("%d",&bz);
        for (i=1;i<=n;i++) 
          scanf("%lld%lld",&a[i].a,&a[i].b),a[i].c=a[i].a*a[i].b;
        sort(a+1,a+n+1,cmp);
        for (i=1;i<=n;i++)
        {
            chu(a[i].b);
            mx();
            cheng(a[i].a);
        }
        for (i=ans[0];i>=1;i--) printf("%d",ans[i]);
        return 0;
    }
    View Code
    I'm so lost but not afraid ,I've been broken and raise again
  • 相关阅读:
    js中split()和join()的用法
    事件监听
    行内元素和块级元素
    parseInt()详解
    进制的转换
    什么叫优雅降级和渐进增强?
    js延迟加载的方式有哪些?
    javascript作用域和作用域链
    函数的原型对象和原型链?
    Tensorflow知识点学习
  • 原文地址:https://www.cnblogs.com/sjymj/p/5906991.html
Copyright © 2020-2023  润新知