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

posted @ 2021-01-05 20:50  pyyyyyy  阅读(109)  评论(1编辑  收藏  举报