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
",ans.size());
    for(int i=0;i<ans.size();i++){
        printf("%d ",ans[i]);
    }
    return 0;
}



原文地址:https://www.cnblogs.com/zhangxianlong/p/10672525.html