Codeforces Round #693 (Div. 3)
A - Cards for Friends
有\(w*h\)的一张纸,如果\(w\)是偶数,可以横向对着成两部分,\(h\)同理,问能否切成至少\(n\)片小纸片
对于\(w,h\)而言,两者相互独立,根据乘法原理,两者能对折次数的乘积即为最多能得到的小纸片数量
B - Fair Division
有\(n\)个数,每个数都是\(1\)或\(2\),问能否分成两组,他们的和相等。
记\(sum\)为所有数的和
- 若\(sum\)为奇数,则不能
- 若\(\frac{sum}{2}\)为奇数,则需要有\(1\)才能使得和相等
- 若\(\frac{sum}{2}\)为偶数,则一定可以使得和相等
C - Long Jumps
给定\(n\)个数\(a_i\),可以选择从索引\(i\)开始,每次跳到第\(i+a[i]\)个数(下一个数是\(a_j,j=i+a_i\)),直到超出\(n\)的范围,你的得分等于到达的数\(a_i\)的总和,求最大的得分。
DP
显然的状态\(dp[i]\)表示从\(i\)开始出发能得到的最大得分
正着想貌似比较难,不妨反过来思考一下
从\(i\)位置出发能获得初始分\(a[i]\),下一次跳到\(a[i+a[i]]\),也就是说从\(i+a[i]\)位置出发得分比从\(i\)位置出发少了\(a[i]\)
for(int i = n; i >= 1; --i){
dp[i] = a[i];
int j = i + a[i];
if(j <= n)
dp[i] += dp[j];
}
贪心
从第\(1\)个数开始跳,到达过的标记一下,如果碰到到达过的,直接停下第二次跳到肯定比第一次跳到的得分小。
D - Even-Odd Game
贪心
有\(n\)个数,Alice和Bob选数,如果Alice选择了偶数,则得到相应的分数,如果Bob选择奇数,则得到相应的分数,问谁赢,Alice 先选。
方法一
开\(long\ \ long\),我人傻了
把奇偶数分别从大到小排序,然后两人每次选择的时候,判断自己的最大的数和别人的最大的数谁的大,如果自己大就选自己的,否则选对面的。
方法二
游戏可以类比成:
如果Alice取一个偶数\(x\),她在全局结果上加\(x\)点,否则为\(0\)。
如果鲍勃取一个奇数\(x\), 他添加\(-x\)点到全局结果, 否则\(0\)。
爱丽丝想让全局结果最大化,而鲍勃想让全局结果最小化。
显然,这个游戏完全等同于条件游戏。
假设现在是Alice的行动。让我们看看数组中的某个数字x。
-
如果这个数字是偶数,那么拿走它就会增加x点,而给Bob就会增加0点。
-
如果这个数字是奇数,那么取它会加\(0\)点,给Bob会加\(-x\)点。
所以,拿x这个数字\(x\)点比不拿(不管奇偶性如何)更有利可图。为了使结果最大化,Alice应该总是取数组中最大的数字。
E - Correct Placement
有\(n\)组\(h\)和\(w\),如果\(i\)要排在\(j\)的前面,那么必须得满足\(w_i<w_j,h_i<h_j\)或者\(w_i<h_j,h_i<w_j\).
对于每一个输出一个可以排在前面的下标,没有就输出\(-1\)。
对所有人按照身高从高到低排序,通过二分查找找到一个身高小于当前这个人的最高的人\(x\),显然在排序后的数组中\(x\)后面的人可以排在当前这个人的前面,只需要预处理出后缀最小宽度即可
对于一个人躺着的情况,只需要把宽度和高度互换即可
F - New Year's Puzzle
给定一个\(2*n\)的方格,其中有些格子被堵住了,问能否用\(1*2\)和\(2*1\)的骨牌填充完整