题目https://www.luogu.org/problemnew/show/P1080

题意:

一个国王和n个大臣,每个人左右手上都有一个数值。

现在将国王排在队首,将大臣进行排序。每个大臣的值是他前面所有人的左手值的积除以他自己右手的值。

问怎样的排序可以使得大臣的值中的最大值尽可能的小。

思路:

看题目感觉会是一个排序的问题,但是刚开始没想出来拿什么当关键字。

后来看了题解。感觉这种题目的关键是先考虑只有两个对象,分别计算这两个对象一前一后得到的答案,然后根据答案的不等式推出应该以什么作为关键字比较两个对象。

因此我们考虑一个大臣左右手的数值是a1,b1,另一个大臣走右手数值是a2,b2,国王的左右手数值是a0,b0

当1在前2在后时,可以得到$k1=a0/b1$和$k2=a0*a1/b2$,设此时答案是ans1

当2在前1在后时,可以得到$k3=a0/b2$和$k4=a0*a2/b1$,设此时答案是ans2

可以发现$k3<k2,k4>k1$

如果$ans1<ans2$恒成立也就是说我们要选择1在前2在后的情况,即$max(k1,k2)<max(k3,k4)$,那么$k4>k2$且$k4>k3$,此时$a2*b2>a1*b1$

这说明了左右手之积较小的应该放在前面。

推出了排序的规则,接下来就比较简单了。要注意的是这道题用到了大数。

 import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Comparator;
import java.util.Scanner; public class Main {
private static class node{
int lft;
int rgt;
}
final static int maxn = ;
static node[] peo;
static Scanner scan = new Scanner(System.in);
static int n; private static class cmp implements Comparator<node> {
@Override
public int compare(node a, node b){
if(a.lft * a.rgt < b.lft * b.rgt)return -;
else if(a.lft * a.rgt == b.lft * b.rgt)return ;
else return ;
}
}
public static void main(String[] args){
n = scan.nextInt();
peo = new node[n + ];
peo[] = new node();
peo[].lft = scan.nextInt();
peo[].rgt = scan.nextInt();
for(int i = ; i <= n; i++){
peo[i] = new node();
peo[i].lft = scan.nextInt();
peo[i].rgt = scan.nextInt();
}
Arrays.sort(peo, , n + , new cmp()); BigInteger res = BigInteger.valueOf(peo[].lft);
BigInteger ans = BigInteger.ZERO;
for(int i = ; i <= n; i++){
ans = ans.max(res.divide(BigInteger.valueOf(peo[i].rgt)));
res = res.multiply(BigInteger.valueOf(peo[i].lft));
} System.out.println(ans);
}
}

洛谷P1080 国王游戏【大数】【贪心】的更多相关文章

  1. 【题解】洛谷 P1080 国王游戏

    目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...

  2. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  3. 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序

    洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...

  4. 洛谷 P1080 国王游戏

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

  5. 洛谷—— P1080 国王游戏

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

  6. [NOIP2012] 提高组 洛谷P1080 国王游戏

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

  7. 洛谷P1080 国王游戏

    两个难点. 怎么想到的贪心? 首先确定算法: 显然不是数据结构题.转成图论也不太可能. 考虑DP:f[i][j]表示前i个人取j状态的最小最大值......2^1000,直接放弃. 因为出现了“最大值 ...

  8. 洛谷 P1080 国王游戏 题解

    原题 传送门 思路 分析 我们先假设队伍如下: People left hand right hand Before \(S_a\) A \(a_1\) \(b_1\) B \(a_2\) \(b_2 ...

  9. P1080 国王游戏 (等待高精度AC)

    P1080 国王游戏 题解 贪心策略:按照大臣左右手数字乘积从小到大排序 假设我们已经把大臣排了一个顺序 假定在这个顺序下我们可以保证  得到奖赏最多的大臣所得奖赏最少 那么我们一旦交换任意两个大臣, ...

随机推荐

  1. Python if __name__ == '__main__': 理解

    if __name__ == '__main__':是为了区分.py文件是自己直接被执行还是被其他文件调用. 当.py文件直接被执行时,默认的是 __name__ = '__main__',因此条件成 ...

  2. webpack-dev-server 导致的 invalid host header

    这几天做的一个项目,在这个项目的 js 方面,我将其分业务和功能的拆分成模块化,然后使用 webpack 来进行打包.(第一次在公司产品中使用 webpack) 然后使用了 webpack-dev-s ...

  3. Hadoop介绍与安装

    前言 最近想学习下大数据,有点急于求成,于是去网上找了各种培训机构的视频,发现大都质量不佳,理论基本不说或者简单讲下,然后教你照猫画虎的敲代码,出了问题都没法分析.最后还是找了厦门大学的公开课从理论开 ...

  4. (二十八)动态盐的MD5加密算法(java实现)

    目录 文章目录 @[toc] 源代码: 函数用法讲解: 用法代码实例: 对比普通 **`MD5`** 的优点 实现思路: 后来我发现,BCryptPasswordEncoder 是这个思路的实现的最优 ...

  5. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  6. python学习-6 猜拳小游戏

    import random # 调用随机数模块 pc = random.randint(1,3) # 产生1-3的随机数 print("来玩个猜拳游戏吧!") a = '石头' b ...

  7. Python 基础(十六)--随机数模块

    random随机数模块 random.randint(1,10):随机1-10包括10 random.randrange(1,10,2):在1.3.5.7.9中随机,类似切片,不包括10 random ...

  8. ThreadLocal使用场景,原理

    ThreadLocal 1. 先说下 ThreadLocal不能解决多线程间共享数据,他是一个隔离多线程间共享数据的好帮手 2. ThreadLocal是本地线程共享数据 3. 他是以空间换时间 sy ...

  9. linux mysql 数据库操作导入导出 数据表导出导入

    linux mysql 数据库操作导入导出 数据表导出导入 1,数据库导入 mysql -uroot -p show databases; create database newdb; use 数据库 ...

  10. Memcached和Spring集成开发

    xml配置文件 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" facto ...