Codeforces Round #436 (Div. 2)

Codeforces Round #436 (Div. 2)

第一次算rate的cf比赛,排名还算不错,但也看到了竞争的激烈,一题可以秒掉几百人,可怕。。。(那些人为什么会有空去hack别人)

A. Fair Game

题目描述:给出一个有\(n\)(偶数)个元素的数组\(a\),判断给数组是否只由两个不同的数组成,并且这两个数的个数相等,如果是,则输出这两个数,否则输出"NO"

solution
模拟题
时间复杂度:\(O(n)\)

B. Polycarp and Letters

题目描述:给出一个长度为\(n\)的字符串\(st\),从\(1\)\(n\)选出若干个数组成集合\(A\),若集合\(A\)满足:1、\(st[A[i]]\)为不同的小写字母 2、对于所有的\(A[i]<A[j]\)都有\(st[k]\)不是大写字母\((A[i]<k<A[j])\)。问\(A\)最多有多少个元素。

solution
将集合\(A\)中的元素从小到大排序,题目中的第二个条件就相当于是\(A\)相邻两个元素对应的位置之间的字符不是大写字母。所以大写字母就把字符串\(st\)分为了多个字符串,这些每个字符串中不同字母个数最多的就是答案。
时间复杂度:\(O(n)\)

C. Bus

题目描述:有一辆巴士在数轴上的\(0\)\(a(a>0)\)之间来回移动,从\(0\)出发或回到\(0\)为一趟,巴士一共要走\(k\)趟。在\(f(0<f<a)\)处有一个加油站,巴士可以停下来加油,巴士的油箱容量为\(b\),每次加油都会把油箱装满,初始时巴士的油箱是满的。问巴士至少要加多少次油才能走完\(k\)趟,若无解则输出"NO"

solution
贪心。若不能走到加油站,则输出无解,到加油站后,若能坚持到下一次到加油站(或终点),则这次不加油,否则加油,若加完油还是不能坚持到下一次到加油站(或终点),则输出无解。
时间复杂度:\(O(k)\)

D. Make a Permutation!

题目描述:给出一个有\(n\)个元素的数组\(a\),数组\(a\)中的元素都在\([1, n]\),现在要就数组\(a\)修改为一个\(n\)排列,修改操作为每次将一个元素改成另一个数,问最少要修改多少次,在修改次数一样下,输出修改后字典序最小的排列。

solution
数组\(a\)缺了多少个元素,就要修改多少次,问题在于字典序最小。
假设当前枚举到第\(i\)个元素,当前最小的缺失的数为\(j\),某个数\(num\),在[i, n]有多少个为\(sum[num]\), 某个数\(num\)是否可以修改为\(changeable[num]\)
若$ (changeable[a[i]]==true || ( sum[a[i]]>1$ && \(a[i]>j))\),那么就将\(a[i]\)修改为\(j\)。后一个条件挺好理解的,就是如果\(a[i]\)在后面还有多个,而且\(a[i]\)比缺失的数大,那么修改之后肯定更好。
\(changeable\)是什么呢?当\(changeable[a[i]]==false\)时,相当于第一次碰到\(a[i]\)这个数,\((sum[a[i]]==1 || a[i]<j)\),这个数只有一个,肯定不能修改,\(a[i]<j\),修改后字典序不优,所以该位置不修改,但\(a[i]\)可能在后面会有出现,而后面的位置必须修改,所以将\(changeable[a[i]]=true\),表示这个数一定要修改。
时间复杂度:\(O(n)\)

E. Fire

题目描述:现在发生了一场大火,有\(n\)个物品可以拯救,每个物品有三个属性\(t_i, d_i, p_i\),分别表示拯救所需时间,物品烧坏的时刻,物品的价值。选择要拯救的物品以及次序,使得拯救的物品的总价值最大。

solution
dp。首先按\(d_i\)进行排序,然后做一次背包,如果不用输出方案,则数组可以只用一维,但现在要记方案,那就只能用二维。
时间复杂度:\(O(max(d_i)n)\)

F. Cities Excursions

还没有调试出来。。。

posted @ 2017-09-29 09:02  GerynOhenz  阅读(244)  评论(0编辑  收藏  举报