CF 738D 贪心
http://codeforces.com/contest/738/problem/D
题意:小时候玩的潜艇游戏,只不过题目是在一维上面,已知有一些长度为L的潜艇,玩家已经侦测了一些位置但是没有发现潜艇,问题是玩家再侦测那些位置可以确保发现潜艇。
思路:贪心取就好,首先把可能有潜艇的区间拿出来(长度大于等于L的),然后对于这些区间每隔L就取一个,并且可能放的最多的潜艇-1,重复上述过程,直到不能再将m个潜艇放在剩下的位置,那么就确保一定发现了潜艇。。。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,a,b,k;
string s;
vector<pair<int,int> > v;
vector<int> ans;
int main(){
cin>>n>>a>>b>>k>>s;
int tot=0,be=0;
int sum=0;
for(int i=0;i<s.size();i++){
if(s[i]=='0'){
tot++;
}
else{
sum+=tot/b;
if(tot>=b)
v.push_back(make_pair(tot,be));
tot=0;
be=i+1;
}
}
if(s[s.size()-1]=='0'){
sum+=tot/b;
if(tot>=b)
v.push_back(make_pair(tot,be));
}
for(int i=0;i<v.size();i++){
if(sum<a) break;
int x=v[i].first;
int be=v[i].second;
int ll=be+x;
//cout<<"B"<<be<<" "<<be+x<<endl;
while(be+b<=ll){
ans.push_back(be+b);
be=be+b;
sum--;
if(sum<a) break;
}
}
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%d ",ans[i]);
}
return 0;
}