250(模拟, sort)
题目链接
http://community.topcoder.com/stat?c=problem_statement&pm=11084&rd=15854
意思就是说对于字符串有两种排序方式
第一种 按照字典序的顺序进行排序
第二种 按照字符串的长度进行排序
然后对于给定的字符串
判断它是怎样的加序方式
总共四种可能
思路:
写的时候直接暴力枚举过的 = =(特别暴力)
分别用两种不同的排序方法 把该字符串向量进行排序
然后一个个进行对于判断是否是加序的
ac代码
http://paste.ubuntu.com/7504257/
官网给的思路也差不多 不过它的实现方法要比我的简单的多
就是只对向量遍历一次 同时判断当前是否加序 然后记录
官网解法链接
http://apps.topcoder.com/wiki/display/tc/SRM+621
500(dp)
题目链接
http://community.topcoder.com/stat?c=problem_statement&pm=13166&rd=15854
意思是给你一组整数
可以去任意个数加和 但是每个数只能取一次 可以重复
然后问你能够组成的连续最大数是多少(1,2,3.。。。)
思路
比赛的时候没有写出来。。纠结了
官方题解也没看懂= =
不过后来在summary中找个代码感觉很巧妙!
就是我们先对这组数据从小到大排序
用一个变量sum记录当前能够到达的最大数
然后我们就从最小s【0】开始判断是否<= sum + 1
若过是的话 那么用sum加上s【i】(意思是我们最大能够到达sum)
否则就然会直接 return sum+1(我们往后就不再 连续)
十分巧妙
用sum来作为1~max的遍历
同时限制了s【i】的范围
这里我又有一种理解大家也可以参考下(不晓得对不对 = =)
也可以认为这是一个偏序关系,sum+1是他们理论上的最小上界 而s【i】是他们的实际最小上界
如果实际最小上界大于理论最小上界就结束 。
ac代码
http://paste.ubuntu.com/7523481/