这一场突发奇想的想先从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])(注意只有一个时需要特判)