A.Avoiding Zero
题目链接:https://codeforces.ml/contest/1427
题目大意:给定一个数组a1,a2...,an,要求找出一个a重排后的数组b1,b2,...,bn使得对于任意k,b1+b2+...+bk!=0
题解:
令sum=a1+a2+...+an,
若sum=0,则显然无解
若sum>0,则不妨将>0的放在最前面,其次放<0,=0的不放在第一位即可
若sum<0,则不妨将<0的放在最前面,其次放>0,=0的不放在第一位即可
这样做可以确保b数组前缀和始终与sum正负性相同。
B. Chess Cheater
题目链接:https://codeforces.ml/contest/1427/problem/B
题目大意:给定一个长度为n的仅由'W'和'L'组成的字符串和一个整数k,最多可以更改k个'W'为'L'或者'L'为'W'。若一个'W'前面一个字符也是'W',则得2分,否则得1分(第一个字符为'W'时得1分),输出最大得分
题解:
这题是一道贪心题,首先将'W'改为'L'肯定不会更优,只会更劣,其次WLW改为WWW得分+3,WLLW改为WWLW得分+2,WLLLW改为WLWLW得分+1
那么不难发现将非连续的W块改成连续的W块每次可以+2分/3分,当且仅当两个非连续W块中间只有一个L时将其改成W后得分+3,因此得到我们的贪心思路:优先修改长度最小的连续L块
若存在至少一个W,那么每次答案至少+2,且+3的次数可以最大化。
1.若全是L则特判即可。
2.存在至少一个W时:
要注意的是对于左端点是1或者右端点是n的L块比较特殊,可以证明无论长度多小放在最后修改都会更优,为了方便后续计算答案不妨强制设置这两个块的大小为k+1。
最终答案:初始化ans为刚开始的答案,L块从小到大排序后依次处理,若当前L块大小x<=k,则k-=x,ans+=2*x+1,即将该L块全部变为W块的答案贡献值
若当前L块大小>k,则break,然后ans+=2*k即可。
C. The Hard Work of Paparazzi
题目链接:https://codeforces.ml/contest/1427/problem/C
题目大意:还是看原题题目吧qwq
题解:
令dp[i]表示ti时刻在(xi,yi)点时的最大答案,则dp[i]=max(dp[j])+1(其中t[j]+|x[i]-x[j]|+|y[i]-y[j]|<=t[i])
因为1≤xi,yi≤r≤500,则|x[i]-x[j]|+|y[i]-y[j]|<=(500-1)*2=998,且t是严格递增数列,那么最坏情况下有t[i-998]=t[i]-998+|x[i]-x[j]|+|y[i]-y[j]|<=t[i],所以不妨令DP=max(dp[j])+1(t[j]+998<=t[i])
则复杂度为O(n*r),时限2s可过。
D. Unshuffling a Deck
题目链接:https://codeforces.ml/contest/1427/problem/D
题目大意:给定一个1~n的排列,让你通过至多n次题目所给的重排方式将其排序。
题解:
套路题,这种操作限制次数题一般说来看操作限制的次数就能得到一个大致做法了,而且一般来说都会卡满这个操作限制次数
这题我考试时得想法是每次用两个操作使得第i小和第i大在对应位置。
假设第i小在当前排列位置为p,第i大为q
1.若p<q,不妨设原排列为A B p C q D E ,A为1~i-1,E为n-i+2~n
第一次选A Bp C qD E,则变为E qD C Bp A
第二次选E q D C B p A,则变为A p B C D q E
2.若p>q,不妨设原排列为A B q C p D E,A为1~i-1,E为n-i+2~n
第一次选A Bq C pD E,则变为E pD C Bq A
第二次选E pDCBq A,则变为A p D C B q E
最大操作次数为(n/2)*2次
PS:这题因为至少选择两个,所以要特判一下,就这里卡了我半个多小时,错了两次...