国王的游戏(华东师范大学-信息学竞赛学教案)

信息学竞赛学教案


【引入问题】国王的游戏

恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

【输入】

输入文件为game.in。

第一行包含一个整数n,表示大臣的人数。

第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

【输出】

输出文件名为.out。

输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

【输入输出样例】

Game .in Game .out

3  2

1 1

2 3

7 4

4 6

【输入输出样例说明】

按1、2、3号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

按1、3、2这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

按2、1、3这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

按2、3、1这样排列队伍,获得奖赏最多的大臣所获得金币数为9;

按3、1、2这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

按3、2、1这样排列队伍,获得奖赏最多的大臣所获得金币数为9。

因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。

【数据范围】

对于20%的数据,有1≤n≤10,0 < a、b <8;

对于40%的数据,有1≤n≤20,0 < a、b < 8;

对于60%的数据,有1≤n≤100;

对于60%的数据,保证答案不超过109;

对于 100%的数据,有 1 ≤n ≤1,000,0 < a、b < 10000。

【问题分析】:这道题主要关键是与前面的有关,而与后面的无关。我们可以先确定第n个大臣,然后确定第n-1个大臣,依次类推,因为我们确定了第i个大臣后,第1~i-1个大臣都不用乘以i~n个大臣的左手,也就是没有后效性。那么如果第i个大臣是排在最后,那么就要奖赏:left(1,n)/(right(i)*left(i)),我们把每一位大臣的这个值算出来,装在v数组里面,然后按从大到小排序。为什么是从大到小呢,如图所示,数组v,已按从大到小排序,所以v[i]>v[j].


如果i、j的位置不变,那么奖赏最多的大臣有可能在i、j之间,但是如果把i、j的位置转换,我们知道,在v[i]~v[j]之中,v[i]是最大的所以获得最多的奖赏的大臣肯定是i,比之前的更差或不变。所以我们要按从大到小排序,我们发现left(1,n)/(right(i)*left(i))中,left(1,n)是不变的,我们把这个公式*1/(left(1,n)),公式就变成right[i]*left[i],但因为乘了一个倒数,所以符号变了,所以要按
right[i]*left[i]  的值从小到大排序。然后模拟一次就可以了。

因为数很大(对于100%的数据,有1《n《1000,   0<a,b<10000)所以要用高精度乘和高精度除。

由此引出大整数的乘除法

大整数的乘法:

Int a[1000],b[1000],result[1000]

现在要计算:

a[0]a[1]a[2]a[3]a[4]……a[999]

X b[0]b[1]b[2]b[3]b[4]……b[999]

=?

首先低位对齐,此处设定的是 a[0]为高位,则可能数组 a
并没有存满。

a[0]a[1]a[2]a[3]a[4]……a[i]

X b[j]

Result[n-1]+=a[i]*b[j]%10000

Result[n-2]+= a[i]*b[j]/10000  进位

……

循环

 2 大整数的除法:

现在要计算(大整数除以一个简单的整数)

bi )a[0]a[1]a[2]a[3]a[4]……a[999]

判定:a[0]<bi?

Yes: shang[i] = (a[0]*10000+a[1])/bi shang[i+1]=((
a[0]*10000+a[1])%bi)*10000+a[2])/bi

No: shang[i] = a[0]/bi
shang[i+1]=((a[0]%bi)*10000+a[1])/bi

循环,注意 a[0]=bi 时候的情况   

 

【引出参考代码】:.python

[n],*k=([int(x) for x in line.split()]for line in
open(‘4302.in‘))

c=[[0,0]]*n

for i in range(1,n+1):

    c[i-1]=[k[i][0]*k[i][1],i]

c.sort()

king=k[0][0]

MAX=king//k[c[0][1]][1]

for x in range(0,n):

    t=king//k[c[x][1]][1]

    king=king*k[c[x][1]][0]

    if t>MAX:

        MAX=t

open(‘4302.out‘,‘w‘).write(‘{:d}\n‘.format(MAX))

 

 

 

学生提问,是否听懂,以及讲解。

完。

时间: 2025-01-07 17:23:17

国王的游戏(华东师范大学-信息学竞赛学教案)的相关文章

2018年华东师范大学数学竞赛试题

https://wenku.baidu.com/view/ad61b24326284b73f242336c1eb91a37f11132d6 或者: http://math.funbbs.me/viewthread.php?tid=70&extra=page%3D1 原文地址:https://www.cnblogs.com/zhangzujin/p/9098378.html

算法艺术与信息学竞赛书摘

<算法艺术与信息学竞赛>这本书我详细看了1.1.1.2.1.3,之后就看得不是很懂了,所以还是把摘要写出来,方便让我知道到底能学到什么. 第一章 算法与数据结构 “数据结构+算法=程序设计” 从理论分析和实际应用两方面阐述了算法与数据结构的基本知识. 1.1 概括的叙述了算法.数据结构.以及计算理论的一些概念. 1.2从实例出发,概括的介绍了一些基本算法,包括美剧.贪心.递归.递推. 1.3介绍基本数据结构,包括线性表队列.栈.树.二叉树.以及图遍历与拓扑排序. 1.4介绍了一些实用数据结构,

最大的幻术-游戏开发-到底是先学游戏引擎还是先学游戏编程

学习游戏的目的 我们学习游戏制作,游戏开发,游戏编程,游戏XX,我们的目的只有一个,打造一个非常牛逼,非常屌,非常让人开心的虚拟体验.我们用自己的学识让玩家在虚拟世界征战,生活,一步一步的让玩家幸福!那么我们的目的只有一个,让玩家知道自己的幸福在哪里,并且学会追求自己的幸福.当然,每个人对幸福的定义不一样.那么,我们只好让玩家来体验我们所来表达的最通俗的,最普遍的幸福体验,然后慢慢引导玩家去寻找自己的幸福体验.可能,在最后玩家都会离开游戏,离开虚拟世界,(对,这是真的,玩家需要一步一步达到定点,

最小割模型在信息学竞赛中的应用___读后的收获

在看了Amber的<最小割模型在信息学竞赛中的应用>后感觉到了自己的智障-- 我还是按照目录来,其实第一个子目录中我收获最大的还是01分数规划的内容. 01分数规划:给定n个条件,在其中选取一些条件,使得要求的目标函数达到最值. 通俗一点说:给定两个数组,a[i]表示选取i的收益,b[i]表示选取i的代价.如果选取i,定义x[i]=1否则x[i]=0.每一个物品只有选或者不选两种方案,求一个选择方案使得R=sigma(a[i]*x[i])/sigma(b[i]*x[i])取得最值,即所有选择物

美梦1(JSOI2014,算法艺术与信息学竞赛)

[问题描述] 这天晚上,约翰做了个奇怪的美梦.他拥有了分别分布在N座高高低低的山上的N个池塘,N座山连成一条直线,从左往右第i座山的高度是Hi.池塘中的鱼都是他请专家运用科学的方法专门养殖的,为了保护每个池塘的生态环境,他现在要在这N座山上建造若干个看护点.约翰是个很节约的人,在第i座山建造看护点的花费为Ci.假设在第i座山建造一个看护点,则往左或者往右第一座不比这座山低的山将挡住看护的视线.譬如说: {Hi} = {1 4 4 5 7 2}表示第一座山高度为1,第二座山高度为4... 如果在第

【点击模型学习笔记】广告点击率估算技术综述_华东师范大学学报2013

概要: 不是一篇高质量文章,不过是一篇还算不错的综述,而且时间够新(2013). 具体内容:按照文章原本内容顺序罗列 0. 介绍 * 赞助商广告:投放到搜索结果页面 * 情境广告:在网页某个位置上投放,一般由广告联盟介入 1. 广告点击率预测的应用背景 * 广告点击率一般比较低,能达到0.2%就已经是很好的投放了 * 大量的广告.查询都是很稀疏的 * 利用用户点击行为的,除了点击率预测,还有两个领域:搜索结果排序和推荐系统 * "Inferring Clickthrough Rates on A

信息学竞赛一本通提高版AC题解—例题1.1活动安排

书中代码有误.书中为sort(a+1,a+n+1,Cmp). // // Created by yuxi on 19-1-13. // /* * * <信息学竞赛一本通-提高版>全部AC解答及解释 * * 第一部分 基础算法 * 第一章 贪心算法 * 例题1 活动安排 * */ #include <iostream> #include <algorithm> #include <fstream> #include <string> using n

沙盘游戏(2017绍兴市第十五届少儿信息学竞赛复赛试题)

沙盘游戏 Ivy是如此地喜欢编程,以至于在面对游戏时也是如此.在沙盘游戏中有一个巨大的方形沙盘(长方形或者正方形),该沙盘被分隔成边长为1的小方格,每个小方格内有一个整数.沙盘玩家需要在沙盘中圈出一个方形(长方形或者正方形都可以)的区域(必须沿着小方格的边界划线,不能穿过小方格的内部),目标是争取被圈区域内的整数之和最大.为了描述方便,Ivy把这个沙盘用n*m个整数来表示,每个整数所在位置表示沙盘中一个边长为1的小方格.Ivy现在需要编程解决这样一个问题:在n*m(n行m列)个整数中选择一个x*

【转】对信息学竞赛中调试方法的建议

信息学之于其他竞赛学科的不同,就在于需要通过写程序来表达自己的思维和想法.如何尽可能又快又好地调试程序,成了我们必须要思考的问题.相信很多同学都有过这样的经历:思考一个算法只花了半个小时,但是把这个算法写对却花了一天..思考与实现的时间往往不成正比. 下面是我结合自己的经验给出的一些小建议,仅供大家参考,如果有不太好的地方,也欢迎指正~ 关于调试有一个大前提,就是思考的方向一定得严谨正确,因为思考决定实现,如果思考的时候有漏洞,那么实现的程序肯定也不强健.在想出算法之后不要急着实现,一定要认真反