SRM 436 DigitsSwap (math)

题目链接:http://www.topcoder.com/stat?c=problem_statement&pm=10342

题目大意:给定两个数x和y,通过对x和y某些位交换后,使得x*y的结果最大,交换次数给定

解题思路:因为x和y对应位不管怎么交换,x+y的值保持不变,所以要使x*y最大,只要是x和y之间的距离最小就可以。如何寻找最小距离的x和y呢?首先假设x>y,从左到右扫描,找到第一个x[i]<y[i],使他们交换过来,继续扫描,后面的每位都保证x[i]<y[i],并记录下交换的次数n和是否有某位相同的情况。如果n=swaps,则即为最大的;如果n<swaps,还得继续,如果有某位相同,则剩下的交换都交换这里就可以,如果没有相同的位,则判断剩下的交换次数是否是偶数,如果是,则通过对某个对应位,反复交换,不改变x和y,如果不是,只要把最后一个改变的位交换过来就可以;如果n>swaps,从数位较小的开始,对已经改变的变回去,操作n-swaps就可以。由于变与不变是相对的,所以通过计算两次,(x,y)和(y,x),并去最大的那个结果。注意最大的结果不是字符串较大的那个。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值