中级农民
- 积分
- 113
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-2-20
- 最后登录
- 1970-1-1
|
来贴代码了,昨天睡觉的时候优化到了O(n),其实证明链表里每次断裂后不会产生新的连续3个S(或者1,2个s,如果当前在检查相应的长度)即可,每遍都从前往后扫一遍就可以啦。
- #include <iostream>
- #include <vector>
- #include <string>
- #include <iterator>
- #include <algorithm>
- #include <list>
- using namespace std;
- int solve(string s,int n,int k)
- {
- list<int> l;
- int res = 0;
- for(auto i:s){
- if(i=='.') // . converts to 1 and S converts to 0
- {
- res++;
- l.push_back(0);
- }else
- l.push_back(1);
- }
- for(int curCheck = 3; curCheck>=1 && k>0; curCheck--)
- {
- if(l.size()<3)
- break;
- auto i=l.begin(), j=i;
- int windowSum = *(i++);
- windowSum += *(i++);
- while(i!=l.end())
- {
- windowSum += *(i++);
- if(windowSum == curCheck)
- {
- res += curCheck;
- k--;
- if(k == 0)
- break;
- l.erase(j++);
- l.erase(j++);
- l.erase(j++);
- windowSum =0;
- if(i == l.end())
- break;
- windowSum += *(i++);
- if(i == l.end())
- break;
- windowSum += *(i++);
- continue;
- }
- windowSum -= *(j++);
- }
- }
-
- return res;
- }
- int main(int argc, const char * argv[]) {
- cout<<solve("SS.S...S....SS..S..S.S.S...SS...SSS..SS.SS.SSSSS...S.S.S...S......S",67,4)<<endl;
- cout<<solve(".S.....SSSSS.SSSS...SS.SSS.SS",29,2)<<endl;
- cout<<solve(".S...SSS.SSS..SSSS.SSSSS.SS.S.SS.SS.SSSSSSS.SS...SS.S.SSS.SS.S.SS..S..S.SSS.SS.",79,6)<<endl;
- cout<<solve("SSSSSS.SSS..SSS.SS.S.SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.SS.SSSSSSSSSSSSSSSSSSS.SSSSSS.SSSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSS.S.SSS.SSSSSS.SSSSSSSSSSS.SSSSSSSSSSSSS.SSSSSSS.S.SSSS.SSSSSSSSSSSS.SSSSSSSSSSSSSSSS.SSS.S.SS.SSSSSSS.SSSSSSSS.SSS.S.",276,23)<<endl;
- return 0;
- }
复制代码 |
|