codevs 1198 国王的游戏

摘要:
有一位国王站在队列的开头,左手拿着数字,右手拿着数字。然后有n个人左手拿着一个数字,左手拿一个数字。然后,他随机对n个人进行排序,将第i个人的权重值定义为前一个人的所有左手数字除以第i个人右手数字的乘积,并询问如何排序,以使n个人的最大权重值最小,并输出该权重值。解决方案:问题是如何排序以最小化最大重量。然后我们需要知道排序条件。为了找出这个条件,我们考虑第i个人和第i+1个人。解:设a和b是第i个人的左手和右手数字,c和d是第一个

题意:

有个国王站在一个队列的开头,左右手各有一个数字,然后有n个人左右手也各有一个数字,然后把这n个人随便排序,定义第i个人的权值为前面所有的人左手数字乘积除以第i个人右手的数字,问的是怎么排序使得这n个人中最大的权值最小,输出这个权值。

题解:

问题是怎么排序使得最大权值最小,那我们就需要知道排序的条件,为了找出这个条件,我们考虑第i个人和第i+1个人。

解:设a,b为第i个人左右手的数字,c,d为第i+1个人左右手的数字,s为第1个人到第i-1个人左手数字的乘积

可以得出第i个人的权值为wi = s / b 第i+1个人的权值为 wi+1 = s * a / d,那么最大值为max (s / b, s * a / d)

可以得出换了位置之后第i+1个人的权值为 wi+1 = s / d 第i个人的权值为 wi = s * c / b,那么最大值为max (s / d, s * c / b)

假设换了位置更优 那么 max (s / d, s * c / b) < max (s / b, s * a / d)

假设s / d > s * c / b 那么 s / d < max (s / b, s * a / d),很显然的是s * a / d > s / d,那么根据s / b > s / d 可以得出d > b 但与条件(b > c * d)矛盾不成立

假设s / d < s * c / b 那么 s * c / b < max(s / b, s * a / d) 但是 s * c / b > s / b所以不考虑,那么由 s * c / b < s * a / d 得出 a * b < c * d 符合条件 b < c * d

得出结论:按照左右手乘积从小到大排序一定最优

因为我很懒就没有写高精度了QAQ

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 1e3 + 7;
#define ll unsigned long long
int n;
ll sl, sr;
struct node {ll L, R;} p[N];

bool cmp (node a, node b) {
	return a.L * a. R < b.L * b.R;
}

int main () {
	scanf ("%d", &n);
	cin >> sl >> sr;
	for (int i = 1; i <= n ;++i) {
		cin >> p[i].L >> p[i].R;
	}
	sort (p + 1, p + 1 + n, cmp);
	ll sum = sl, maxi = 0;
	for (int i = 1; i <= n; ++i) {
		maxi = max (maxi, sum / p[i].R);
		sum = sum * p[i].L;
	}
	cout << maxi << endl;
	return 0;
}

  

总结:

这种按照某种方式变化的题型,需要我们找到变化的最优条件,不妨设一设,搞一搞总会搞出来的~

免责声明:文章转载自《codevs 1198 国王的游戏》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 高级部分fedora19安装后,需要安装的一些必备的软件包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

PartⅠ邮件伪造

什么是伪造发件人邮件地址简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 即简单邮件传输协议,是在Internet传输email的事实标准。正如名字所暗示的那样,它其实是一个非常简单的传输协议,无需身份认证,而且发件人的邮箱地址是可以由发信方任意声明的,利用这个特性可以伪造任意发件人。如何识别虚假(欺骗性)电子邮件...

全网最详细的最新稳定OSSEC搭建部署(ossec-server(CentOS7.X)和ossec-agent(CentOS7.X))(图文详解)

OSSEC是一款开源的基于主机的入侵检测系统,可以简称为HIDS。它具备日志分析,文件完整性检查,策略监控,rootkit检测,实时报警以及联动响应等功能。详细的介绍和文档可以参考官网网站:http://www.ossec.net/环境本文中的环境极其简单,两台CentOS7虚拟机。CentOS7的安装详解服务端:  计算机名:ossec-server  I...

mysql之排序查询

高级文章目录3:排序查询功能:1.按单个字段排序案例1:查询员工信息,要求工资从高到低排序2.为排序添加筛选条件案例1:部门编号˃=90的员工信息,按员工编号降序排序案例2:部门编号˃=90的人员信息,按输入时间排序。按表达式排序案例1:按年薪显示员工信息和年薪4按别名排序案例1按年薪升序查询员工信息5.按函数(长度)排序案例1查询员工姓名并按姓名长度减少...

NodeJs使用jwt生成token以及使用express-jwt校验和解密token

=0){//当数据库有当前用户时,它返回tokenlettoken=jwt.sign;res.send}else{res.send}}catch{//p抛出异常并将其发送到错误中间件以处理console.log;next;}})//注册接口路由器。post('/register',异步(req,res,next)=˃{let{用户名,密码,昵称}=req-b...

Oracle11g温习-第七章:redo日志

thread:线程,在单实例的环境下,thread#永远是1sequence:日志序列号。在日志切换时会递增。FIRST_CHANGE#:在当前日志中记录的首个数据块的scn。...

安装qmake与环境变量解析

如果你已经有了qmake,可以跳过这里,请看10分钟学会使用qmake。手动安装qmake在手工连编Qt之前,下面这些环境变量必须被设置:QMAKESPEC这个必须设置为你所使用的系统的平台和编译器的组合。当编译完成时,qmake已经可以使用了。这里对添加环境变量时,是在path里头添加,还是new一个变量有点疑惑。而如果是new的话,当我们在为程序添加路径...