zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    数组的拼接
    numpy的切片和索引
    细说python中的round()方法
    Numpy数组的创建
    快排 [随机数]
    对于归并排序递归的理解
    A1044 Shopping in Mars [连续子序列分割]
    A1085 Perfect Sequence [二分、two pointers]
    快速幂
    [转] 二分法求外接圆最大半径
  • 原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7846121.html
Copyright © 2011-2022 走看看