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)

全部评论
n=2,k=1 1 2 2 1 答案应该输出0,因为一定要交换K次,但是你的代码输出2,说明数据水了。。。
点赞 回复 分享
发布于 2021-07-20 10:55

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务