Sea Battle CodeForces

题意:

有n个格子,a条船,每条船占b个格子。事先已经射击了k个格子,且这k次射击不会射到船上,求再射击几次可以射到某一条船的某一部分

思路:

观察样例可以发现,如果五个0,船的长度是3,那么这五个0中可能有

1 2 3

2 3 4

3 4 5 

这三种位置都包含3这个id,所以,我们只需要射击到3这个位置就可以射击到船的某一部分

所以,我们只需要统计有多少个连续的0,就可以得到这连续的0中可能包含的船的条数,进而计算出最少的射击次数,也就是0的个数除以船的长度。

得到了总的设计次数,将其减去船的个数,便可以得到多余的射击次数,也就是说,五次射击,三条船,那么你在射击两次之后一定能射击到船的某一部分,所以最终答案就是

将其+1。那么这题就解决了,我们最后所要做的只不过是记录射击的位置,任意输出即可!

#include <map>
#include <set>
#include <ctime>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;
#define   maxn          200000+10
#define   lson          l,m,rt<<1
#define   rson          m+1,r,rt<<1|1
#define   clr(x,y)      memset(x,y,sizeof(x))
#define   rep(i,n)      for(int i=0;i<(n);i++)
#define   repf(i,a,b)   for(int i=(a);i<=(b);i++)
#define   pii           pair<int,int>
#define   mp            make_pair
#define   FI            first
#define   SE            second
#define   IT            iterator
#define   PB            push_back
#define   Times         10

typedef   long long     ll;
typedef   unsigned long long ull;
typedef   long double   ld;

const double eps = 1e-10;
const double  pi = acos(-1.0);
const  ll    mod = (1e9+7);
const  int   inf = 0x3f3f3f3f;
const  ll    INF = (ll)1e18+300;

using namespace std;

int main(){
    int n, num, len, k;
    cin >> n >> num >> len >> k;
    string s;
    cin >> s;
    vector <int > id;
    int sum = 0;
    for (int i = 0; i < s.length();){
        //char c = s[i];
        if (s[i] == '1'){
            i ++ ;
            continue;
        }
        int length = 0;
        while(s[i] == '0'){
            length++;
            i++;
            if ( length % len == 0){
                id.push_back( i );
            }
        }
        sum += length/len;
        length = 0;
        //cout << "++++" <<endl;
    }
    //cout << sum << endl;
    int answer = sum - num + 1;
    cout << answer <<endl;
    //cout << answer <<endl;
    int flag = 0 ;
    for (int i = 0; i < answer; i ++){
        if (!flag){
            cout << id[i];
            flag = 1;
        }
        else {
            cout << " " << id[i] ;
        }
    }
    cout << endl;
}
原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7846121.html