我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html

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

对于很多要求一个序列使得结果最优,那么这个序列该怎么排的题目,我们都可以用微扰的思想来解决。

假定我们已经求出了最优序列,并且在这个顺序下,交换任意两项都不会更优。因为交换任意两项可以通过交换相邻两项得来,所以也就是交换任意相邻两项不会更优。

令\(fake[i]\)等于\(\prod\limits_{j=0}^{j=i}left[i]\)。对于任意\(i,i+1\)存在:

交换前,他们分别拿到:

\(fake[i-1]/right[i]\),\(fake[i-1]*left[i]/right[i+1]\)

交换后分别得到:

\(fake[i-1]/right[i+1]\),\(fake[i-1]*left[i+1]/right[i]\)

由于任意交换都不会使得结果更优,所以:

\(max(fake[i-1]/right[i],fake[i-1]*left[i]/right[i+1])<=max(fake[i-1]/right[i+1],fake[i-1]*left[i+1]/right[i])\)

提出公因式:

\(max(1/right[i],left[i]/right[i+1])<=max(1/right[i+1],left[i+1]/right[i])\)

则\(1/right[i+1]\)与\(left[i+1]/right[i]\)这两个数中,必然有一个数同时大于等于\(1/right[i]和left[i]/right[i]\)。因为\(1/right[i+1]<=left[i]/right[i+1]\),所以\(left[i+1]/right[i]>=left[i]/right[i+1]\)。

所以对于任意\(i\),\(i+1\),都存在:

\(left[i]*right[i]<=left[i+1]*right[i+1]\)

按这个排序然后模拟就行了。

时间复杂度:\(O(n*高精度)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn=1005,pps=10000; int n; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct person {
int lft,rgt; bool operator<(const person &a)const {
return lft*rgt<a.lft*a.rgt;
}
}p[maxn]; struct Bignum {
int num[1050]; void clear() {
memset(num,0,sizeof(num));
} void init() {
clear();num[0]=num[1]=1;
} Bignum operator*(const int &a)const {
Bignum c;c.clear();c.num[0]=num[0];
for(int i=1;i<=num[0];i++) {
c.num[i]+=num[i]*a;
c.num[i+1]+=c.num[i]/pps;
c.num[i]%=pps;
}
if(c.num[c.num[0]+1])c.num[0]++;
return c;
} Bignum operator/(const int &a)const {
Bignum c;c.clear();c.num[0]=num[0];
int tmp=0;
for(int i=num[0];i;i--) {
c.num[i]=(tmp*pps+num[i])/a;
tmp=(tmp*pps+num[i])%a;
}
while(!c.num[c.num[0]]&&num[0])c.num[0]--;
return c;
} bool operator<(const Bignum &a)const {
if(num[0]!=a.num[0])return num[0]<a.num[0];
for(int i=num[0];i;i--)
if(a.num[i]!=num[i])
return num[i]<a.num[i];
return 1;
} void print() {
printf("%d",num[num[0]]);
for(int i=num[0]-1;i>0;i--)
printf("%04d",num[i]);
}
}; int main() {
n=read();
for(int i=0;i<=n;i++)
p[i].lft=read(),p[i].rgt=read();
sort(p+1,p+n+1);Bignum tmp,ans;
ans.clear();tmp.init();tmp=tmp*p[0].lft;
for(int i=1;i<=n;i++) {
ans=max(ans,tmp/p[i].rgt);
tmp=tmp*p[i].lft;
}ans.print();
return 0;
}

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

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

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

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

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

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

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

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

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

  5. 洛谷 P1080 国王游戏

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

  6. 洛谷—— P1080 国王游戏

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

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

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

  8. 洛谷P1080 国王游戏

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

  9. 洛谷 P1080 国王游戏 题解

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

  10. 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)

    次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1​∗b1​<a2​∗b2​是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...

随机推荐

  1. 函数的光滑化或正则化 卷积 应用 两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积

    http://graphics.stanford.edu/courses/cs178/applets/convolution.html Convolution is an operation on t ...

  2. Mac标识物理位置算法 import Levenshtein mac列表特征值

    mac 字符串 与 基准字符串的 Levenshtein   距离,考虑  mac信号强度的时序性,60秒内若干次变化 不引入强度 mac字符串的唯一性 如何排序 基准字符串的选取 同一尺度 都按强度 ...

  3. font awesome (图标字体库)

    Font Awesome fa是什么? 图标字体库和CSS框架 怎么用? <link rel="stylesheet" href="https://cdn.boot ...

  4. [ZJOI2006]三色二叉树

    [ZJOI2006]三色二叉树 BZOJ luogu 分3种颜色讨论转移一下 #include<bits/stdc++.h> using namespace std; const int ...

  5. Linux使用yum安装rpm包

    1.yum其实管理的也是rpm包,只不过依赖什么的都自己做了2.yum在有的linux版本是收费的,但是CentOS是免费的3.yum一般意义上是需要联网的,即:使用网络yum源 a.yum源配置文件 ...

  6. pip-grep

    Pip-pop pip-grep主要是用于方便查看Requirements.txt中那些模块是安装了的.也就是通过输入的然后模块名称然后在Requirements.txt中进行查询.里面比较难的就是d ...

  7. java_Ninja实战过程

    使用Ninja马上两年了,之前多多少少的都是跟着项目模仿着写,今年上半年准备从一个小项目开始从始至终走一遍; 首先官网:http://www.ninjaframework.org; github: h ...

  8. C#调用大漠插件

    大漠插件是一个很不错的东西,在按键精灵和易语言里面用得很多,可以后台找图找字,写游戏自动脚本用得特别多.前面写一个微信的自动脚本,查了一些资料,易语言不太熟悉,按键精灵功能上可能不好实现,就找了些资料 ...

  9. ThinkPHP 3.2.2 事务

    手册里说得非常清楚 : 5.3.19 事务支持 ThinkPHP提供了单数据库的事务支持,如果要在应用逻辑中使用事务,可以参考下面的方法: 启动事务: PHP代码 $User->startTra ...

  10. HDU - 1272 小希的迷宫 【并查集】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1272 思路 只需要判断 这张图 无环 并且只有一个连通块 就可以了 要注意 如果 只输入 0 0 那给 ...