洛谷 P1080 国王游戏 题解
原题
思路
分析
我们先假设队伍如下:
| People | left hand | right hand |
|---|---|---|
| Before | \(S_a\) | |
| A | \(a_1\) | \(b_1\) |
| B | \(a_2\) | \(b_2\) |
| After | \(S_b\) |
现在我们要交换A、B,队伍如下:
| People | left hand | right hand |
|---|---|---|
| Before | \(S_a\) | |
| B | \(a_2\) | \(b_2\) |
| A | \(a_1\) | \(b_1\) |
| After | \(S_b\) |
我们可以发现:这样交换对于Before 和 After部分的结果没有影响,只对A 和 B 的部分结果有影响。
对于交换前的答案:
\(ans1=\max\{\dfrac{S_a}{b_1},\dfrac{S_a\times a_1}{b_2}\}\)
对于交换后的答案:
\(ans2=\max\{\dfrac{S_a}{b_2},\dfrac{S_a\times a_2}{b_1}\}\)
我们知道,这些数都是大于等于\(1\)的正整数,于是:
\(\dfrac{S_a\times a_1}{b_2} \ge \dfrac{S_a}{b_2}\)
\(\dfrac{S_a\times a_2}{b_1} \ge \dfrac{S_a}{b_1}\)
因此,当我们假定 \(ans1 < ans2\)时,一定是:
\(\dfrac{S_a\times a_1}{b_2} < \dfrac{S_a\times a_2}{b_1}\)
化简得:
\(a_1\times a_2 < b_1 \times b_2\)
算法
显然,此关系满足传递性,即当
\(a_1\times a_2 < b_1 \times b_2\)
\(b_1\times b_2 < c_1 \times c_2\)
有:
\(a_1\times a_2 < c_1 \times c_2\)
因此,我们可以贪心,只要按此规则排序,再统计答案即可,注意要高精
代码
压位高精:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define ll long long
const int MAXN = 1010;
const int base = 10000;
int n;
struct people{
int x,y;
bool operator < (const people &b ) const {
return (ll)x * y < (ll)b.x * b.y;
}
}peo[MAXN];
struct bignum{//only mul ,comp ans so on
int a[1020],len;
bignum() {//初始化
memset(a,0,sizeof(a));
len = 1;
}
void resize(){//限制位数
len = 1010;
for(int i = len - 1;i >= 0;i--)
if( a[i] > 0 ) {
len = i + 1;
return;
}
len = 1;
}
bool operator < (const bignum &b) const{//比大小
if ( len != b.len) return len < b.len;
for(int i = len - 1 ;i >= 0 ;i--){
if(a[i] != b.a[i]) return a[i] < b.a[i];
}
return 0;
}
bignum operator * (const int &b) const{ //乘法(高精乘int)
bignum c;
for(int i = 0; i < len ;i++){
c.a[i] += a[i] * b;
if( c.a[i] >= base) {
c.a[i+1] += c.a[i]/base;
c.a[i] %= base;
}
}
c.resize();
return c;
}
bignum operator / (const int &b) const{//除法(高精除int)
ll temp = 0;
bignum c;
if( b == 0) {
printf("Error!");
return c;
}
for(int i = len -1;i >= 0;i--){
temp = temp * base + a[i];
if(temp >= b) {
c.a[i] = temp / b;
temp %= b;
}
}
c.resize();
return c;
}
void print (){//输出
resize();
printf("%d",a[len-1]);
if ( len > 1)
for(int i = len - 2;i >=0;i--){
printf("%04d",a[i]);
}
return;
}
};
int main (){
scanf("%d",&n);
for(int i = 0;i <= n;i++){
scanf("%d %d",&peo[i].x,&peo[i].y);
}
sort(peo+1,peo+n+1);
bignum ans,tot;
tot.a[0] = 1 ;
tot = tot * peo[0].x;
for(int i = 1;i <= n;i++){
bignum temp = tot / peo[i].y;
tot = tot * peo[i].x;
if( ans < temp ) ans = temp;
}
ans.print();
return 0;
}
反思总结
应该是太久没写压位高精了,打错了INF回,我有几个出错的地方:
- 在
resize()函数里未在最后设置len=1,导致数为0时len很大 resize()函数里面把return写成break;,导致每个被resize()的数的len=1base可以去1e5但只取了1e4print()函数里面输出记忆错误:
printf("%4d",a[i]);
显然,少了0
5. *函数里面写成了:
bignum operator * (const int &b) const{
bignum c;
for(int i = 0; i < len ;i++){
c.a[i] = a[i] * b;
if( c.a[i] >= base) {
c.a[i+1] += c.a[i]/base;
c.a[i] %= base;
}
}
c.resize();
return c;
}
总的来说,我也要多练习压位高精……
洛谷 P1080 国王游戏 题解的更多相关文章
- 【题解】洛谷 P1080 国王游戏
目录 题目 思路 \(Code\) 题目 P1080 国王游戏 思路 贪心+高精度.按\(a \times b\)从小到大排序就可以了. \(Code\) #include<bits/stdc+ ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序
洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...
- 洛谷P1080 国王游戏【大数】【贪心】
题目:https://www.luogu.org/problemnew/show/P1080 题意: 一个国王和n个大臣,每个人左右手上都有一个数值. 现在将国王排在队首,将大臣进行排序.每个大臣的值 ...
- [NOIP2012] 提高组 洛谷P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- 洛谷 P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最 ...
- 洛谷—— P1080 国王游戏
https://www.luogu.org/problem/show?pid=1080 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整 ...
- 洛谷P1080 国王游戏
两个难点. 怎么想到的贪心? 首先确定算法: 显然不是数据结构题.转成图论也不太可能. 考虑DP:f[i][j]表示前i个人取j状态的最小最大值......2^1000,直接放弃. 因为出现了“最大值 ...
- 【贪心】洛谷 P1199 三国游戏 题解
这个题尽管题目长,主要还是证明贪心的正确性(与博弈关系不大) 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战 ...
随机推荐
- 初步了解Windows7下部署Sonar
1.准备工具: (1)Sonar 8.3版本. (2)PostgresSql 11版本. (3)Java 11. 详细获取地址可参考文章https://www.pianshen.com/article ...
- C#中的闭包和意想不到的坑
虽然闭包主要是函数式编程的玩意儿,而C#的最主要特征是面向对象,但是利用委托或lambda表达式,C#也可以写出具有函数式编程风味的代码.同样的,使用委托或者lambda表达式,也可以在C#中使用闭包 ...
- 虹软人脸识别——官方 Qt Demo 移植到 Linux
一.前言 最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK.之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果.打开 Li ...
- es性能调优---写优化操作
ES 的默认配置,是综合了数据可靠性.写入速度.搜索实时性等因素.实际使用时,我们需要根据公司要求,进行偏向性的优化. 写优化 假设我们的应用场景要求是,每秒 300 万的写入速度,每条 500 字节 ...
- android自定义控件onMeasure方法
1.自定义控件首先定义一个类继承View 有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/ ...
- 几个超级实用但很少人知道的 VS 技巧
大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作 ...
- 如何修改linux下tomcat指定的jdk路径
一般情况下,一台服务器只跑一个项目,只需根据所需项目,将linux默认的jdk环境配置好即可.某些时候一台服务器上会跑多个项目,而且各个项目需要的JDK版本各不相同,或者为了使业务独立开来,需要指定T ...
- 2020_06_18Mysql事务
1.事务的基本介绍 1.概念:一个包含多个步骤的事务,被事务管理,要么同时成功,要么同时失败. 2.操作: 2.1 开启事务:start transaction; 2.2 回滚:rollback; 2 ...
- Nginx深入学习(一篇搞定)
我们的口号是:人生不设限! 一.nginx简介 1.什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发 ...
- webpack模块打包简易版
webpack基本使用流程(react) 1.安装webpack脚手架 cnpm install webpack webpack-cli -D 2.安装处理css的loader cnpm instal ...