[NOIP2012 提高组] 国王游戏

news/2024/10/24 1:41:06

前言

题目传送门:https://www.luogu.com.cn/problem/P1080
依然是看题解会的,博主是飞舞。
找不到题解出处了,只记得在csdn上看的,果咩那塞原博主。

题目大意

\(1\)个国王和\(n\)个大臣,每个人左手和右手都写了一个数字。
国王站在队首,\(n\)个大臣排在后面。
每个大臣能获得的金币数为前面所有人左手数字的乘积除以本人右手数字(向下取整)。
问能获得最多金币的大臣的金币数最小为多少。

思路

题目分析

由分析可知,对于第\(i\)个大臣来说,前面的\(i-1\)个大臣的顺序无论怎么变化,只要这\(i-1\)个人是确定的,都不影响第\(i\)个大臣的金币数。

所以在分析时我们先假定前\(i-1\)个大臣的左手积是固定的,设为\(S\)
讨论第\(i\)\(i+1\)大臣的先后顺序
\(a_i\)为此时第\(i\)个大臣的左手的数,\(b_i\)为右手
那么第\(i\)个大臣的金币为\(S/b_i\)
\(i+1\)个大臣的金币为\(S \cdot a_i/b_{i+1}\)

若两人交换位置
则第\(i\)个位置的金币为\(S/b_{i+1}\)
\(i+1\)个位置为\(S\cdot a_{i+1}/b_i\)
若换位后第i+1位置的金币和原来比不减少,即

\[S \cdot a_i/b_{i+1} \leq S\cdot a_{i+1}/b_i \]

化简得

\[a_i \cdot b_i \leq a_{i+1}\cdot b_{i+1} \]

接下来证明在这个公式约束下,最后一个大臣的金币是最大的
即证明交换位置后第\(i\)位的金币不大于第\(i+1\)
即证明

\[S/b_{i+1} \leq S \cdot a_{i+1}/b_i \]

化简得

\[b_i \leq a_{i+1} \cdot b_{i+1} \]

由数据范围可知:\(a_i \geq 1\),所以该式显然成立,命题得证

注意事项

由数据范围\(1≤𝑛≤1,000,0<𝑎,𝑏<10000\)可知
最大的积可能为\(10000^{1000}=10^{4\times1000}=10^{4000}\)
所以明显要用到高精,具体到本题,就是高精除和高精乘

代码

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define ll long long
using namespace std;ll n, a, b, cnt = 1; //cnt记录高精数的位数
ll x[4005] = {1}, y[4005]; //高精乘基础值为1struct info {ll x;ll y;bool operator<(const info &o)const {return x * y < o.x * o.y;}
} e[1005];void mtp(ll u);
void div(ll u);
void print();
void solve();void mtp(ll u) { //高精乘ll temp = 0;for (ll i = 0; i < cnt; ++i) {x[i] *= u;}for (ll i = 0; i < cnt; ++i) {temp += x[i];x[i] = temp % 10;temp /= 10;}while (temp != 0) {x[cnt] = temp % 10;cnt++;temp /= 10;}
}void div(ll u) { //高精除ll temp = 0;for (ll i = cnt - 1; i >= 0; i--) {temp = temp * 10 + x[i];y[i] = temp / u;temp %= u;}
}void print() {ll temp = cnt;if (n == 1) { //特判只有一个大臣的情况cout << e[0].x / e[1].y << '\n';} else {while (y[temp] == 0) { //去掉前置0temp--;if (temp == -1) { //保证每个大臣至少会得到一个金币?cout<<1<<'\n'; //“所有的大臣都会获得国王奖赏的若干金币”return ; //感觉题目应该说的更明白一点}}for (ll i = temp; i >= 0; i--) { //打印高精数cout << y[i];}}
}void solve() {cin >> n;for (ll i = 0; i <= n; i++) {cin >> e[i].x >> e[i].y; //读入国王和大臣}sort(e + 1, e + n + 1); //仅对大臣排序for (ll i = 0; i < n; i++) {mtp(e[i].x); //对前面的国王和n-1个大臣累乘}div(e[n].y); //已证明得最后的大臣的金币最大,所以只用看最后一个大臣的金币print();
}int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);ll t = 1;
//	cin>>t;while (t--) {solve();}return 0;
}

收获

  • 之前没有高精度的板子,以这道题为契机补充了板子()
  • 自己给出了证明,开心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网课视频课程下载神器,学无止下载器,快过期的课程有救了!

有多少小伙伴像我一样,准备在假期好好学点兴趣以内的东西,结果发现花费好几百块买的课居然过期了打开之后课程已经过期,无法观看了(网易云课堂购买的课程过期后无法观看了。。。)又想学习,又不想再浪费钱,该怎么办呢?一顿操作猛如虎,费了半天功夫装了X猴,装了各种插件…

手把手教你如何下载智慧职教(职教云)视频课程课件资料

前言:很多同学都想知道智慧职教(职教云)中课程视频资料怎么下载,但是智慧职教中某个课程的目录中展示的视频和资料是不提供直接下载方式的,所以下面就教大家如何用学无止下载器下载目录中展示的视频资料,包括MP4,PPT和PDF。 一、电脑登录智慧职教网页版 网页版智智慧职教…

手把手教你如何下载知到智慧树视频课程课件资料

前言:很多同学都想知道知到智慧树课程中的课件资料怎么下载,但是知到智慧树中某个课程的目录中展示的课件有时候是不提供直接下载方式的,所以下面就教大家如何下载知到智慧树目录中展示的视频和课件资料,包括PPT和PDF。 提示:操作需要用到Windows电脑,Mac还不支持 一、电…

手把手教你如何下载超星学习通视频课程课件资料

前言:很多同学都想知道超星学习通中课程资料怎么下载,但是超星学习通中某个课程的目录中展示的资料是不提供直接下载方式的,所以下面就教大家如何下载超星学习通目录中展示的视频课件资料,包括PPT和PDF。 一、电脑登录超星学习通网页版,复制课程链接【https://i.chaoxing.…

学堂在线视频课件课程下载工具,如何在电脑端下载学堂在线视频课程课件资料PDF,PPT到本地?

一. 安装学堂在线课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/xuetangx_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无…

爱课程视频课件课程下载工具,如何在电脑端下载爱课程视频课程课件资料PDF,PPT到本地?

一. 安装爱课程视频课件下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/icourses_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学…

v4l2 test driver: vimc解析

v4l2 test driver: vimc解析 前言 v4l2驱动框架分为:控制流+数据流,vimc是一个很好学习这两点的驱动; vimc不需要硬件支持,通过软件模拟了:支持isp处理的sensor + csi(虚线代表可以通过media ctl修改topology) 控制流体现在:topology的修改上; 数据流体现在:buffer的流…

知到智慧树视频课件课程下载工具,如何在电脑端下载知到智慧树视频课程课件资料PDF,PPT到本地?

一. 安装知到智慧树课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/zhihuishu_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学…