寒假集训Day 3 #2020011700047-

知识点目录

1 模拟

模拟是对真实事物或者过程的虚拟。模拟要表现出选定的物理系统或抽象系统的关键特性。模拟的关键问题包括有效信息的获取、关键特性和表现的选定、近似简化和假设的应用,以及模拟的重现度和有效性。可以认为仿真是一种重现系统外在表现的特殊的模拟。(来自百度百科)
顾名思义,模拟就是我们去用代码实现某种操作,他怎么说你就怎么做,他要求你做什么你就做什么。
模拟是竞赛中最基础的一项基本功,对思想难度要求不高,主要考察选手的代码能力

1 水仙花数

2020011700047

题意描述

输出所有的"水仙花数".所谓"水仙花数"是指这样的一个三位数:其各位数字的立方和等于该数本身。
例如:\(371\)是一个"水仙花数",\(371=3^3+7^3+1^3\).

题解

对于一个三位数\(x\)
百位:\(\dfrac{x}{100}\)
十位:\(\dfrac{x}{10}\mod10\)
个位:\(x\mod 10\)
判断这三个数的立方和是否为\(x\)即可

2 河伯阵型

2020011700048

题意描述

河伯最近在打一个叫魔兽争霸3的游戏,这个游戏可以控制兵推掉对面的老家,而这个游戏阵型很重要,河伯现在要排成一个菱形,所以请你帮河伯排一下阵型

输入

3 ^

输出

  ^
 ^^^
^^^^^
 ^^^
  ^

题解

?---?

3 USACO-1.1.2-Greedy Gift Givers

2020011700049

题意描述

一共有\(n\)个人要互相送礼物,每个人准备了一些钱来给自己想送的人买礼物。同一个人送出的礼物都是等价的,多余的钱会自己留下,求n个人送完礼物之后,每个人都赚了或者亏了多少钱。

题解

?---?

2 贪心

贪心算法是指在对问题求解时,总是做出在当前看来是最优的决策
换言之,就是不从全局最优方面考虑,只考虑局部最优情况
贪心算法有时可以得到全局的最优解,这取决于贪心的策略

一个正确贪心的例子

排队接水问题

\(N\)个小朋友来接水,每个人接水要用\(a_i\)的时间,求最小的等待总时间。等待总时间是指所有小朋友的等待时间之和。显然这是一个小学奥数中的简单题。我们让接水时间短的人排在前面,时间长的人排在后面,可以证明这种方案是正确的。

一个错误贪心的例子

\(N\)个小朋友,\(M\)块糖,给出一个二维数组,其中\(a_{i,j}\)代表第\(i\)个小朋友获得\(j\)块糖之后的喜悦值,要求求出所有小朋友的喜悦值之和最大是多少
可以想到一种贪心方式是:对于每块糖,我们选择获得这块糖之后对答案贡献最大的小朋友,把糖分给它
反例:

2 3
1 100

所以我们可以得出,不是所有的情况都可以贪心,一般来说,当我们试图用贪心做法来解决一道题的时候,最好能先证明贪心的正确性,否则只靠猜测一般来说是不正确的。
下面几道例题并不全是可以贪心的。如果大家认为可以贪心,请说明你的贪心策略,最好能尝试证明贪心的正确性。

4 最大排列

2019011700050

题意描述

有一个长度为\(N\)的序列,每个元素互不相同,现在给你\(K\)次操作机会(可以不用完),每次可以交换相邻两个数,求在这种条件下,你能交换出的字典序最大的序列是什么,\(N\leq 5000\).

题解

贪心可做√
由于要求字典序最大,也就是说我们的目标是:让第一个数尽可能大,在这个基础上让第二个数尽可能大…所以每次我们在可选的范围内找到一个最大的数,把他交换到前面,然后处理下一位即可。

5 运输

2020011700051

题意描述

黑板上N个正整数,给出一个正整数K每次你可以擦掉黑板上的两个数A,B,然后在黑板上写下(A+B)/K向下取整的值,直到只剩下一个数,问剩下的数最少是多少,N<=10000.

题解

贪心可做√
错误的贪心策略:从大到小依次擦掉。可以举出反例,所以我们在考场上应该多出几组数据来尝试卡掉自己的贪心策略
正确的贪心策略:每次选取最大的两个数擦掉

6 防御导弹[NOIP 1999]

2020011600052

题意描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截 系统有一个缺陷:虽然它的第一发炮弹能够达到任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。已知敌国每颗导弹的高度,问:用一套系统最多能拦截多少导弹?如果要拦截所有导弹最少要配备多少套这种导弹拦截系统?

题解

第一问贪心不可做×
可以证明所有关于这道题的贪心做法都是错误的。都可以举出反例(最长不下降子序列LIS)
第二问贪心可做√
贪心策略:每个导弹能打就打

7 Cow Acrobats

2020011700053

题意描述

\(N\)头牛,每头牛有体重和力量两个属性,他们要在一起叠罗汉,每头牛的危险值\(=\)它上面所有牛的体重之和\(-\)这头牛的力量,求所有牛的最大危险值最小是多少

题解

贪心可做√
贪心策略:把所有牛按照体重+力量从小到大排序,小的在上面
正确性证明:
对于一种排列方案,如果我们可以找到相邻的两头牛\(i,j\)\((i\)在上\()\)使得交换它们的位置之后答案变小,则这种方案一定不是最优解
我们考虑不想出现这种情况需要满足什么,设体重为\(a\),力量为\(b\),上面所有牛的体重之和为\(W\),则有:
\(\max(W-b_i,W+a_i-b_j)\leq \max(W-b_j,W+a_j-b_i)\)
化简之后得\(a_i+b_i\leq a_j+b_j\)
也就是说,若不按照\(a_i+b_i\)从小到大进行排列则一定不是最优解
而按照\(a_i+b_i\)从小到大排列只有一种方案(相同的是等价的),所以这就是最优解

3 二分

4 分治

5 递推

6 构造法

猜你喜欢

转载自www.cnblogs.com/liuziwen0224/p/jixunday3.html