2021牛客暑期多校训练营1-G.Game of Swapping Numbers(思维)
Game of Swapping Numbers
https://ac.nowcoder.com/acm/contest/11166/G
题目链接:https://ac.nowcoder.com/acm/contest/11166/G
题目大意:给两个数组a,b,现在可以交换a中的数k次,求的最大值。
看了题解。可以这样想:把要求的值看作对每个和前面放符号,满足总的+的数目=总的-的数目。那么,最后的结果就是a、b所有数*符号后的和。
统计没有交换前的答案。根据贪心原则,最大的结果应该就是。这样就相当于对每个赋为+,赋为-。
考虑交换。显然,我们要交换的目标是两个符号不同的数,然后交换他们的符号,者才能使得答案变化。在考虑贪心,想要最后答案最大,肯定是要使得+的和最大,-的和最小,因此,考虑将上面+的数降序排列为数组add,-的数升序排列为数组sub,若与对于某一i,使得,则可以考虑交换这两个数的符号,可以使得答案增大。注意k的限制。
另外:题目要求一定要k次操作,但是其实,若我们交换完所有,k仍有剩余,可以考虑add内或sub内自己交换,符号不会变化,消耗掉次数。
upd:注意需要特判2的情况,感谢评论区大佬提供的样例Orz
n,k=map(int,input().split()) a=[x for x in list(map(int,input().split()))] b=[x for x in list(map(int,input().split()))] add=[] sub=[] if n==2: if k%2==0: print(abs(a[0]-b[0])+abs(a[1]-b[1])) else: print(abs(a[0]-b[1])+abs(a[1]-b[0])) else: ans=0 for i in range(n): ans+=abs(a[i]-b[i]) add.append(max(a[i],b[i])) sub.append(min(a[i],b[i])) add.sort() sub.sort(reverse=True) for i in range(min(n,k)): if sub[i]>add[i]: ans+=(sub[i]-add[i])*2 else: break print(ans)