博客
关于我
YbtOJ 贪心算法课堂过关 例4 国王游戏【贪心】
阅读量:340 次
发布时间:2019-03-04

本文共 2137 字,大约阅读时间需要 7 分钟。

在这里插入图片描述


思路

这道题其实主要的难点是如何排序

排序之后贪心就非常简单了。

考虑

s i = ∏ j = 0 i a j s_i=\prod\limits_{j=0}^{i}a_j si=j=0iaj

首先考虑交换前,第 i i i 个上的值是 s i − 1 b i \frac {s_{i-1}}{b_i} bisi1,第 i + 1 i+1 i+1个 是 s i − 1 × a i b i + 1 \frac {s_{i-1}\times a_i}{b_{i+1}} bi+1si1×ai

a n s 1 = max ⁡ ( s i − 1 b i , s i − 1 × a i b i + 1 ) ans_1=\max(\frac {s_{i-1}}{b_i},\frac {s_{i-1}\times a_i}{b_{i+1}}) ans1=max(bisi1,bi+1si1×ai)

交换后 i i i 的位置就变成了 i + 1 i+1 i+1 i + 1 i+1 i+1 的位置就变成了 i i i

值分别为 s i − 1 b i + 1 \frac {s_{i-1}}{b_{i+1}} bi+1si1 s i − 1 × a i + 1 b i \frac {s_{i-1}\times a_{i+1}}{b_i} bisi1×ai+1
a n s 2 = max ⁡ ( s i − 1 b i + 1 , s i − 1 × a i + 1 b i ) ans_2=\max(\frac {s_{i-1}}{b_{i+1}},\frac {s_{i-1}\times a_{i+1}}{b_i}) ans2=max(bi+1si1,bisi1×ai+1)

显然 s i − 1 b i < s i − 1 × a i + 1 b i \frac {s_{i-1}}{b_i} < \frac {s_{i-1}\times a_{i+1}}{b_i} bisi1<bisi1×ai+1

并且 s i − 1 b i + 1 < s i − 1 × a i b i + 1 \frac {s_{i-1}}{b_{i+1}} <\frac {s_{i-1}\times a_i}{b_{i+1}} bi+1si1<bi+1si1×ai
如果 a n s 1 < a n s 2 ans_1<ans_2 ans1<ans2
那么 s i − 1 × a i b i + 1 < s i − 1 × a i + 1 b i ) \frac {s_{i-1}\times a_i}{b_{i+1}}<\frac {s_{i-1}\times a_{i+1}}{b_i}) bi+1si1×ai<bisi1×ai+1)
通过化简,得:
a i ⋅ b i < a i + 1 ⋅ b i + 1 a_i\cdot b_i<a_{i+1}\cdot b_{i+1} aibi<ai+1bi+1
由此可见,对 a ∗ b a*b ab 进行关键字排序就可以了。
这题还需要高精度!!!

C o d e Code Code

#include
#include
#include
#include
#include
using namespace std;long long ff[10100],f[10100],ans[10100];long long n,js=1;struct node{ long long x,y;}a[1000010];bool cmp(const node&d,const node&dd){ return d.x*d.y
=1; i--) { ff[i]=(f[i]+jw*10); jw=ff[i]%x; ff[i]/=x; }}void gjbj(){ int j=10000; while(ans[j]==0) j--; int jj=10000; while(ff[jj]==0) jj--; if(jj>j) for(int i=1; i<=jj; i++) ans[i]=ff[i]; else if(jj==j) for(int i=jj; i>=1; i--) if(ans[i]
ff[i]) break; memset(ff,0,sizeof(ff));}int main(){ cin>>n; for(int i=1; i<=n+1; i++) scanf("%lld%lld",&a[i].x,&a[i].y); sort(a+2,a+2+n,cmp); f[1]=1; for(int i=2; i<=n+1; i++) { gjc(a[i-1].x); gju(a[i].y); gjbj(); } int j=10000; while(ans[j]==0) j--; for(int i=j; i>=1; i--) cout<

转载地址:http://dale.baihongyu.com/

你可能感兴趣的文章
MySQL-时区导致的时间前后端不一致
查看>>
2021-04-05阅读小笔记:局部性原理
查看>>
go语言简单介绍,增强了解
查看>>
2.1 Kubernetes--Pod
查看>>
python file文件操作--内置对象open
查看>>
Error connecting to undo manager of souce file
查看>>
ERP/MIS开发 LLBL Gen多表操作
查看>>
架构师入门:搭建基本的Eureka架构(从项目里抽取)
查看>>
Java核心技术及面试指南 流程控制方面的面试题答案
查看>>
MongoDB 快速扫盲贴
查看>>
修复搜狗、360等浏览器不识别SameSite=None 引起的单点登录故障
查看>>
2017/08/21 工作日志
查看>>
EXTJS4.2——10.Tab+Iframe
查看>>
WEB基础——AJAX
查看>>
one + two = 3
查看>>
Kali Day01 --- arpspoof命令进行断网攻击(ARP欺骗)
查看>>
echart关系图平分节点删除时自动平衡问题
查看>>
【Coursera】Internet History 读书笔记
查看>>
《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
查看>>
PHP serialize && unserialize Security Risk Research
查看>>