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

相关推荐

机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务