原题

传送门

思路

分析

我们先假设队伍如下:

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\)

我们可以发现:这样交换对于BeforeAfter部分的结果没有影响,只对AB 的部分结果有影响。

对于交换前的答案:

\(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回,我有几个出错的地方:

  1. resize() 函数里未在最后设置len=1 ,导致数为0时len很大
  2. resize() 函数里面把 return 写成break; ,导致每个被resize()的数的len=1
  3. base可以去1e5但只取了1e4
  4. print()函数里面输出记忆错误:
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 国王游戏 题解的更多相关文章

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

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

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

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

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

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

  4. 洛谷P1080 国王游戏【大数】【贪心】

    题目:https://www.luogu.org/problemnew/show/P1080 题意: 一个国王和n个大臣,每个人左右手上都有一个数值. 现在将国王排在队首,将大臣进行排序.每个大臣的值 ...

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

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

  6. 洛谷 P1080 国王游戏

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

  7. 洛谷—— P1080 国王游戏

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

  8. 洛谷P1080 国王游戏

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

  9. 【贪心】洛谷 P1199 三国游戏 题解

     这个题尽管题目长,主要还是证明贪心的正确性(与博弈关系不大) 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战 ...

随机推荐

  1. Flutter学习笔记(37)--动画曲线Curves 效果

    如需转载,请注明出处:Flutter学习笔记(37)--动画曲线Curves 效果

  2. TestNG配合ant脚本进行单元测试

    上面就是一个简单的SSM框架的整合,数据库来自宜立方商城的e3-mall采用一个简单的spring-mvc和spring以及mybatis的整合 单元测试代码为 TestUserByTestNG.ja ...

  3. Github仓库如何选择开源许可证

    Github仓库如何选择开源许可证 目录 Github仓库如何选择开源许可证 为什么需要开源许可证? 不使用开源许可证对于开发者有何影响? 不使用开源许可证对于项目的使用者有何影响? Github的开 ...

  4. 14 张思维导图构建 Python 核心知识体系

    ZOE是一名医学生,在自己博客分享了很多高质量的思维导图.本文中所列的 14 张思维导图(高清图见文末),是 17 年作者开始学习 Python 时所记录的,希望对大家有所帮助.原文:https:// ...

  5. 【搬砖】/etc/passwd 文件结构

    文件的内容: 每个Linux都会有root账号,以此来说明,从内容上看,每行都使用[:]分隔(注意:每行前面的数字是行号,不是内容),所以一共有七部分内容,分别是: 1. 账号名称:root,用来对应 ...

  6. 别逃避,是时候来给JVM一记重锤了

    今天是猿灯塔“365天原创计划”第2天.   今天讲:   为什么写这个主题呢? 之前看到不少同学在讨论,     今天呢火星哥抽出点时间来帮大家整理一下关于JVM的一些知识点     一.JVM是什 ...

  7. JavaScript之DOM的增删改查

    JavaScript的组成: 1. ECMAScript-语法规范 2. Web APIs(浏览器提供的工具) (1).BOM (浏览器对象模型) (2).DOM (文档对象模型) 今天就来讲讲DOM ...

  8. Git篇--将代码上传到git完整版

    1.注册github账号. 2.创建个人的github仓库,如图,   或者也可以进入个人中心去创建,   还可以直接点击右上角的“”+“”添加, 3.创建自己的Repository,如图: 4.新建 ...

  9. day79 组件化开发

    目录 一.组件[component] 默认组件 二. Vue自动化工具(Vue-cli) 1 安装node.js 2 npm 3 安装Vue-cli 4 使用Vue-CLI初始化创建前端项目 4.1 ...

  10. 主题博客添加 h5 贴边音乐插件

    前言: 前几日,在逛微博的时候,发现微博主页的左下角有一个贴边的音乐小插件,我顿时就想在自己博客上也弄一个玩玩.当时就想把微博那个移植过来,首先我用谷歌浏览器F12 查看页面源码,和检查元素代码,发现 ...