D. Sea Battle【思维】

D. Sea Battle

题意:一个串s,往空的地方放a个长为b的船,当然这a个不能相交。s[i]==1代表这个点禁止放船,问至少选几个点,保证有一个点可以选中一个船

思路:对于一个长为b的区间,选最后一个,能击中的效率会最大。那么处理处k个pos。假设shot这k个位置,一定能打击所有船。假设少射击一个点,能攻击的船从a->a-1。既然只要打中1个,将k个位置去掉a-1个。

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=1e9+7;
//ll a[N][N],sum[N],dis[N];
char s[N];
vector<int> ans;
int main(void){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    ll n,a,b,k;
    cin >>n>>a>>b>>k;
    cin >> s+1;
    for(int i=1;i<=n;i++){
        if(s[i]=='0'){
            int cnt=0,j;
            for(j=i;j<=i+b-1&&j<=n;j++){
                if(s[j]=='0')   cnt++;
                else{
                    break;
                }
                if(cnt==b)  ans.pb(j);
            }
            i=j-1;
        }
    }
    ll res=(int) ans.size()-(a-1);
//    cout << "~"<<ans.size()<<endl;
    cout << res<<endl;
    for(auto t:ans){
        res--;
        cout <<t <<" ";
        if(res==0)  break;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/haipai1998/article/details/80964153