恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。

输入格式:

第一行包含一个整数 n(1≤n≤1000),表示大臣的人数。
第二行包含两个整数 a (0<a)和 b(b<10000),之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出格式:

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

输入样例:

在这里给出一组输入。例如:

3
1 1
2 3
7 4
4 6

输出样例:

在这里给出相应的输出。例如:

2

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路:

1.看题目:获奖赏最多的大臣能够获得的最少奖励数,是贪心算法的明显字眼,但是如何实现贪心呢?

2.如果第一个人排在前面优于第二个人排在前面,那么

max(S/b_{1},S*a_{1}/b_{2}) < max(S/b_{2},S*a_{2}/b_{2})max(S/b1​,S∗a1​/b2​)<max(S/b2​,S∗a2​/b2​)

而又由于a_{1},b_{1},a_{2},b_{2},S>0a1​,b1​,a2​,b2​,S>0,所以 S/b_{2} ≤ S*a_{1}/b_{2}S/b2​≤S∗a1​/b2​。

假设S*a_{1}/b_{2}≥S*a_{2}/b_{1}S∗a1​/b2​≥S∗a2​/b1​,则显然max(S/b_{1},S*a_{1}/b_{2})≥max(S/b_{2},S*a_{2}/b_{1})max(S/b1​,S∗a1​/b2​)≥max(S/b2​,S∗a2​/b1​),矛盾。

所以S*a_{1}/b_{2}<S*a_{2}/b_{1}=>a_{1}*b_{1}<a_{2}*b_{2}S∗a1​/b2​<S∗a2​/b1​=>a1​∗b1​<a2​∗b2​

只需将数组按照a*ba∗b从小到大排序即可。(这对头脑简单的我来说还是太难了,贪心真的太考验脑子了-。-)

3.但除了贪心算法这一个难点只外,还有一个更难的:高精度运算。因为我找的模板都是以字符数组进行相乘和相除的,直接用整数运算我还真的不会。于是我又去题解学习了这一类的写法,发现其实用整数运算更加简单。于是我照葫芦画瓢+自我理解完成了这道题。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1010,maxm=10010;
struct node
{
    int l,r;
}a[maxn];
int pro[maxm],ans[maxm],tmp[maxm];
int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
        {
            f=-1;
            c=getchar();
        }
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
bool cmp(node aa,node bb)
{
    return aa.l*aa.r<bb.l*bb.r;
}
void copy(int *aa,int *bb)
{
    for(int i=0;i<maxm;i=i+1)
    {
        aa[i]=bb[i];
    }
}
bool more(int *aa,int *bb)
{
    for(int i=maxm-1;i>=0;i=i-1)
    {
        if(aa[i]>bb[i])
        {
            return 1;
        }
        if(aa[i]<bb[i])
        {
            return 0;
        }
    }
    return 0;
}

//高精度乘法
void times (int *aa,int num)
{
    for(int i=maxm-2;i>=0;i=i-1)
    {
        aa[i]=aa[i]*num;
    }
    for(int i=0;i<maxm-1;i=i+1)
    {
        aa[i+1]=aa[i+1]+(aa[i]/10);
        aa[i]=aa[i]%10;
    }
    
}

//高精度除法
void div(int *aa,int *bb,int num)
{
    memset(bb,0,sizeof(bb));
    int x=0;
    for(int i=maxm-1;i>=0;i=i-1)
    {
        x=x*10+aa[i];
        bb[i]=x/num;
        x=x%num;
    }
}
void print(int *aa)
{
    bool flag=0;
    for(int i=maxm-1;i>=0;i=i-1)
    {
        if(!flag)
        {
            if(aa[i])
            {
                flag=1;
            }
            else
            {
                continue;
            }
        }
        printf("%d",aa[i]);
    }
}
int main()
{
    int n=read();
    for(int i=0;i<=n;i=i+1)
    {
        a[i].l=read();
        a[i].r=read();
    }
    sort(a+1,a+n+1,cmp);
    pro[0]=1;
    for(int i=0;i<=n;i=i+1)
    {
        div(pro,tmp,a[i].r);
        if(more(tmp,ans))
        {
            copy(ans,tmp);
        }
        times(pro,a[i].l);
    }
    print(ans);
    return 0;
 }

国王游戏(贪心算法+高精度运算)相关推荐

  1. CH - 0701 国王游戏(贪心+高精度运算)

    题目链接:点击查看 题目大意:恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一 ...

  2. 洛谷P1080 国王游戏 贪心+高精度

    https://www.luogu.org/problem/P1080 题目描述 恰逢 HH H国国庆,国王邀请n nn 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王 ...

  3. P1080 国王游戏(贪心+高精度乘除及大数比较)

    https://www.luogu.org/problemnew/show/P1080 题目描述 恰逢 H 国国庆,国王邀请 n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数 ...

  4. 161. Leetcode 55. 跳跃游戏 (贪心算法-贪心区间)

    class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) == 1:return Truecover = 0i ...

  5. 贪心算法——国王游戏

    题目描述 孙悟空给花果山的小猴子们分桃子. 首先,他让每只小猴在左.右手上面分别写下一个整数,悟空自己也在左.右手上各写一个整数. 然后,让这 n 只小猴排成一排,悟空站在队伍的最前面. 排好队后,所 ...

  6. 【题解】P1080 国王游戏(贪心+高精python天下第一)

    P1080 国王游戏 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排 ...

  7. 【贪心】国王游戏(ybtoj 贪心-1-4)

    国王游戏 ybtoj 贪心-1-4 题目大意 有一个国王和n个大臣 每人左右手分别有一个数,现在然你对大臣们排列(国王在第一个) 每个大臣所得金币是前面的人左手上的数的积除以他右手上的数 现在问你获得 ...

  8. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  9. # 国王游戏(贪心+大数乘除+微扰法证明)

    国王游戏(贪心+大数乘除+微扰法证明) 题意:n个大臣和一个国王,左右手都有一个数,排队,国王始终拍在最前面,每个大臣的奖励为这个大臣前面的人的左手上的数之积除以这个大臣右手上的数.构造最优队伍,使得 ...

最新文章

  1. 【ACM】杭电OJ 1862
  2. html css盒子顶层,HTML学习之四CSS盒子
  3. HBase常用操作之namespace
  4. vue seo关键词设置_SEO关键词优化排名的几个技巧
  5. MySQL配置日志服务器_mysql配置数据库日志
  6. libsvm——参数优化工具grid.py的使用
  7. ie型lfsr_什么是PRBS
  8. 分类问题损失函数的信息论解释
  9. Slate轨道工具使用(一)—Track,Clip
  10. 二进制和十进制之间的转换
  11. Python量化分析应该怎么做 ?
  12. Azure NSG网络安全组日志分析
  13. 如何建立一个属于自己的网站(小白教程)
  14. python中倒背如流_倒背如流中倒背是什么意思古代有种背书方法是倒背,倒
  15. 常用Linux版本虚拟机的使用比较
  16. JAVA基础-06.集合-14.【List、Set】
  17. WPF GridSplitter中需要设置HorizontalAlignment和VerticalAlignment
  18. 复指数信号的matlab,复指数函数周期怎么算,为什么复变指数函数是周期函数,而实变指...
  19. python股票分布图_Python股票成交价格分布图(二)
  20. git Husky 搭配 commitizen ,规范代码提交

热门文章

  1. 深度帐户抽象(Account Abstraction):第 1 部分
  2. git使用git pull不能把全部分支拉取到本地
  3. css3与android,Android开发人员不得不学习的CSS3基础
  4. rocky Linux同步时间
  5. 《富爸爸、穷爸爸1》-02
  6. c语言project3: 复杂动态字体显示欲穷千里目更上一层楼,李劲松--“欲穷千里目,更上一层楼”(十六)...
  7. jQuery教程~~~一文完结
  8. 美国俚语:Dark meat?什么意思
  9. 教学向|骨骼构建模太难?zbrush骨骼建模详细讲解(上)
  10. json是什么,如何处理转义?