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\n",cnt);
    for(int i=0;i<cnt;++i) {
        printf("%d%c",op[i],(i==cnt-1)?'\n':' ');
    }
    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\n",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\n",ans+cnt);
    return 0;
}

 

转载于:https://www.cnblogs.com/LinesYao/p/6137135.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值