Codeforces Round #208 (Div. 2) 赛后补题

这一场突发奇想的想先从C题开始做,C题果断不会,赛后发现题目看错了T_T

D题是裸DP,比赛时还是没写出来。

赛后问了kuangbin神的D题思路,挂了几遍后才自己敲出来了。


A. Dima and Continuous Line  

暴力判断两个圆是否相交。


B. Dima and Text Messages

先把n个单词串补成<3word1<3word2<3 ... wordn<3的形式。令其为s,令一个下标num为0.另一串为t,对串t从头到尾扫,如果遇到t[i]==s[num],就给num加1,最后看t串扫完时,s串对应的num是否等于其长度即可。如果相等,说明在t串中<3

<WORDi<3中的WORDi包含了wordi.


C. Dima and Containers

比赛时因为没看到and then empty all containers,所以做不出来。。。

贪心+模拟题。

这题我直接使用了stl里的stack,queue,deque来处理。

首先预处理在每个0之前的最大值,然后每次遇到非0数判断是不是0前的最大值且队列是否为空,是的话就入队列

如果不是则比较stack的最大值(栈顶)与deque的最大值(队首)中的最小值与x的大小关系

如果x小于最小值,则将x放入deque的队尾

如果最小值在deque且x大于该最小值,就把x放在队首

如果如果最小值在stack且x大于该最小值,就把x压入栈顶。

然后取出时直接判断非空即可(注意取出后容器要清空)。



D. Dima and Hares

dp[i][0]表示第i个位置在第i+1个位置之前被喂

dp[i][1]表示第i个位置在第i+1个位置之后被喂

所以dp[1][0]的值初始化为a[1],dp[1][1]的值初始化为b[1]

然后状态转移方程可以写为     

                                      dp[i][0]=max(dp[i-1][0]+b[i],dp[i-1][1]+a[i])

   括号里第一个表达式为先喂i-1,再喂i,再喂i+1          括号里第二个表达式为先喂i,再为i-1和i+1

                                      dp[i][1]=max(dp[i-1][0]+c[i],dp[i-1][1]+b[i])

   括号里第一个表达式为先喂i+1和i-1再喂i              括号里第二个表达式为先喂i+1,再喂i,再喂i-1

最后结果为max(dp[n-1][0]+b[n],dp[n-1][1]+a[n])(注意只有一个时需要特判)








你可能感兴趣的:(Codeforces Round #208 (Div. 2) 赛后补题)