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

    题目描述

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右

    手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排

    成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每

    位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右

    手上的数,然后向下取整得到的结果。

    国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,

    使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

    输入输出格式

    输入格式:

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

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

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

    和右手上的整数。

    输出格式:

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

    金币数。

    输入输出样例

    输入样例#1:
    3 
    1 1 
    2 3 
    7 4 
    4 6 
    输出样例#1:
    2

    说明

    【思路】

    贪心

    最重要的是证明贪心可行。

    【证明】按a*b升序排序。

    设S为第i个大臣之前所有大臣左手累乘。

    设r[i]*l[i]≤r[i+1]l[i+1];

     (1)交换两个大臣的位置对这两个大臣后面的大臣没有影响。

    (2)第i个和第i+1和大臣没有交换位置。

    ans1=max(s/r[i],s*l[i]/r[i+1]);

    交换位置。

    ans2=max(s/r[i+1],s*l[i+1]/r[i])';

    因为

    l[i]*r[i]≤l[i+1]*r[i+1];

    ∴s*l[i]/r[i+1]≤S*l[i+1]/r[i];

    又∵ s/r[i+1]<s*l[i]/r[i+1]

    ∴ s/r[i+1]<s*l[i+1]/r[i]

    ∴ans2=s*l[i+1]/r[i];

    又∵ans1=max(s/r[i]<s*l[i+1]/r[i],s*l[i]/r[i+1]<s*l[i+1]/r[i])

    ans1<ans2;

    所以不交换答案更优。

    但是我不太喜欢这个用结论证明的.....

    【code】

    //洛谷50分做法 按l升序排序
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define LL long long
    #define M 10005
    int n;
    LL ans=-1,sum;
    struct Per
    {
        LL l,r;
    }person[M];
    bool cmp(Per a,Per b)
    {
        if(a.l==b.l)return a.r<b.r;
        return a.l<b.l;
    }
    int main()
    {
        scanf("%d",&n);
        scanf("%lld%lld",&person[0].l,&person[0].r);
        for(int i=1;i<=n;i++)
        scanf("%lld%lld",&person[i].l,&person[i].r);
        sort(person+1,person+n+1,cmp);sum=person[0].l;
        for(int i=1;i<n;i++)
        {
            ans=max(ans,sum/person[i].r);
            sum*=person[i].l;
        }
        printf("%lld
    ",ans);
        return 0;
    }
    //60分。 按a*b排序
    #include<iostream>
    #include<cstdio>
    #include<algorithm> 
    using namespace std;
    #define LL long long
    #define M 10005
    struct Per
    {
        LL l,r;
    }person[M];
    bool cmp(Per a,Per b)
    {
        return a.l+a.r<b.l+b.r;
    }
    int n;
    LL js=1,ans=-1;
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<=n;i++)
        {
            scanf("%d %d",&person[i].l,&person[i].r);
        }
        sort(person+1,person+n+1,cmp);
        js=person[0].l; 
        for(int i=1;i<=n;i++)
        {
            ans=max(ans,js/person[i].r);
            js*=person[i].l;
        }
        printf("%lld
    ",ans);
        return 0;
    }

    100分做法:实在不想打高精....QAQ.

  • 相关阅读:
    django 项目需要注意的一些点
    VUE之路
    Oracle 表格碎片的查看方法
    RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
    RMAN 修复主库 nologging 操作导致物理备库的坏块
    Oracle 数据库19c 回退降级到 11.2.0.4 方案
    如何评估oracle 数据库rman全备和增量备份大小
    在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
    Oracle 数据库坏块处理
    opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
  • 原文地址:https://www.cnblogs.com/zzyh/p/6953902.html
Copyright © 2011-2022 走看看