zoukankan      html  css  js  c++  java
  • codeforces 738

    D: 题意:一行1*n的格子放船只,船数为a,船的长度为b,每格为0或1,1表示该格并不是船只的一部分,找出最少的格子数使得射击这些格子至少能打中一艘船。

      思路:船的长度为b,即每段连续的长度为b的0的串都可以放下一只船,射击点为最后一个格子时最优,找出所有的可以放船的位置res个,选择其中的res-a+1个位置。

    #include<bits/stdc++.h>
    using namespace std;
    char str[200005];
    int op[200005]={0};
    int main() {
        int n,a,b,k,cnt=0,tmp,l,t=0;
        scanf("%d%d%d%d%s",&n,&a,&b,&k,str);for(int i=0;i<n;++i) {
            if(str[i]=='0') ++t;
            if(str[i]=='1') t=0;
            if(t==b) {
                op[cnt++]=i+1;
                t=0;
            }
        }
        cnt-=a-1;
        printf("%d
    ",cnt);
        for(int i=0;i<cnt;++i) {
            printf("%d%c",op[i],(i==cnt-1)?'
    ':' ');
        }
        return 0;
    }

    E  题意:一个公司有n个人,只有一个主管编号为s,除主管外的n-1个人有且仅有一个直接上司,但他的直接上司的上司也算他的上司。给出一个数列为1-n号员工的上司的数目,问至少修改几个值使得该数列为正确。

        思路:要想使得数列正确,数列必须为连续的非降数列,如0111234,且数列中的0只有一个且编号为s。

        如果数列发生错误,则肯定是出现断裂或编号不为s的0,如00234,编号不为s的0必为要修改的,每次出现断裂时先用0补断裂,然后不断用目前最大的数补断裂,如果无数可补,则答案+1,结束。

    #include<bits/stdc++.h>
    using namespace std;
    int a[200005]={0},cnt=0;
    int main() {
        int n,s,last,ans=0;
        scanf("%d%d",&n,&s);
        for(int i=1;i<=n;++i) {
            scanf("%d",&a[i]);
            if(i!=s&&!a[i]) ++cnt;
        }
        if(a[s]!=0) ++ans,a[s]=0;
        sort(a+1,a+n+1);
        last=n;
        int x=upper_bound(a+1,a+n+1,0)-a;
        if(x==n) {
            printf("%d
    ",cnt+ans);
            return 0;
        }
        int f=1;
        for(int i=x;i<=last&&f;++i) {
            while(a[i]>a[i-1]+1) {
                if(cnt) --cnt,++a[i-1];
                else {
                    if(last>i) {
                        --last,++a[i-1];
                    }
                    else {
                        ++ans;
                        f=0;
                        break;
                    }
                }
                ++ans;
            }
        }
        printf("%d
    ",ans+cnt);
        return 0;
    }
  • 相关阅读:
    食物链(并查集)
    字母奔跑
    19+199+1999+……+1999…9(1999个9)和是多少?
    利用union判断CPU是大端模式还是小端模式
    闰年个数(非循环)
    计算catlan数f(n)(动态规划)
    模拟循环调度(队列)
    回溯表达式,+不小于4个,乘号不小于2个,列出表达式种数
    枚举{1,2,3,4}子集
    回溯n个元素的子集
  • 原文地址:https://www.cnblogs.com/LinesYao/p/6137135.html
Copyright © 2011-2022 走看看