cf 729D Sea Battle 【模拟,贪心】

本文介绍了一种针对已知地图长度、船只数量及长度的情况下,如何通过最优探查策略确保能够找到所有船只的方法。文章详细解释了算法思路,并提供了一个具体的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



点击打开链接



题意:  

         在一个线性长度为n的地图里面,有a条船,每条船长度为b ,已经被探查的区域有c个。

         现在问你最少需要探查几次才一定可以探查到船,


题解:


         很明显,船有一定的长度,在该长度的任何一个地方探查都可以探查到船,所以我们最优的方案当然是每隔船长度-1探查一次,每次check一下,

         当剩余空格只能存在a条船的时候,输出已经探查过的地方即可。



#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
ll n,a,b,k;
char s[maxn];
vector<int>ans;
int main(){
    scanf("%lld %lld %lld %lld",&n,&a,&b,&k);
    scanf("%s",s);
    int i,j;
    int f=0,ss=0,cnt=0;
    for(i=0;i<n;++i){
        if(s[i]=='0'){
             f=0;
             for(;i<n&&s[i]=='0';++i)
                f++;
             cnt+=f/b;
        }
    }f=0;
    for(i=0;i<n;++i){
        if(s[i]=='0'){
            int q=0;
            for(;i<n&&s[i]=='0';++i){
                q++;
                if(q%b==0){
                    ss++;
                    ans.push_back(i+1);
                    cnt--;
                    if(cnt<a) f=1;break;
                }
            }
            if(f) break;
        }
    }
    printf("%d\n",ss);
    for(int i=0;i<ans.size();++i)
        printf("%d ",ans[i]);
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值