SRM 556 DIV2 解题报告

250:简单的字符串处理题目,因为最多只有50个字符,所以可以用O(n^2)的算法,对从每个位置开始的字符进行扫描,每次扫到了重复的字符即退出此次扫描,并比较长度是否最大即可。


500:看起来很玄乎貌似不可做,但是用搜索既可以解决这个问题,搜索的时候注意要记录城市i,和经过城市i获得的利润的状态,避免重复搜索以至于死循环。搜索用BFS,开一个队列queue< pair<int, int> > q,初始状态为q.push(make_pair(0, val[0]))。


1000:这道题是看的题解,才知道做法。题解上是这么说的,先不按照题目要求来考虑,如果0可以放在新的字符串首的话,那么只要用贪心就可以解决了。每次从digits里面出来一个字符后,和新生成的字符串首进行比较,如果digit[i] < s[0],那么s = digit[i] + s,否则s = s + digit[i]。这和我一开始的想法是一致的,后来一想字符串首不能放0,简单的贪心确实不好做。那么就重新来看这个问题:最终得到的结果,新生成的字符串首的那个字符,他原来位置后面的所有n - i个字符串必然都是在新生字符串的最后n - i个,所以剩下的子串直接加到新生成的字符串最后即可;而在i之前的字符呢,是经过optimal排序后生成的字符串,那么这一部分只要经过前面所说的贪心就可以达到目的。这个想法确实很新颖,而且题解里面还让我学到了一个string的用法,s.substr(pos, len),即从string s的第pos个字符开始往后的len个字符的子串。


做srm看大牛写的题解就是爽,思路一下子就被打开了大笑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值