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])

[dp[i] = dp[i + a[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)的骨牌填充完整

G - Moving to the Capital

原文地址:https://www.cnblogs.com/pyyyyyy/p/14237875.html