击中战舰 (每日一题)
原题链接: AcWing
题目描述:
李华在玩一款叫做《海战》的小游戏,下面是游戏介绍。 给定一个 1×n 的方格矩阵,方格从左到右依次编号为 1∼n。 在这个方格矩阵中,隐藏着 a 个战舰。 每个战舰都占据 b 个连续的方格,每个方格最多只能被一个战舰占据。 每个战舰的具体位置未知。 玩家的任务就是在这种情况下,向一些方格发动精确打击,如果受到精确打击的方格被某个战舰占据着,则视为击中该战舰。 李华已经向 k 个方格发动了精确打击,不幸的是,一个战舰都没有击中。 请你计算,他至少还需要向多少个方格发动精确打击,才能确保自己可以至少击中一个战舰。 请给出一个具体方案。
输入格式
第一行包含 4 个整数 n,a,b,k。 第二行包含一个长度为 n 的 01 字符串,如果第 i 个字符为 1,则表示第 i 个方格已经受到了精确打击,如果第 i 个字符为 0,则表示第 i 个方格还未受到精确打击。保证字符 1 恰好出现 k 次。
输出格式
第一行输出李华还需要发动精确打击的最少方格数量。 第二行输出李华还需要发动精确打击的方格的具体编号,具体输出顺序随意。 如果方案不唯一,输出任意合理方案均可。
数据范围
前 3 个测试点满足 1 ≤ n ≤ 13。 所有测试点满足 1 ≤ n ≤ 2×10^5,1 ≤ a, b ≤ n,0 ≤ k ≤ n−1。
输入样例1:
5 1 2 1
00100
输出样例1:
2
4 2
输入样例2:
13 3 2 3
1000000010001
输出样例2:
2
7 11
解题思路:
这道题是一个模拟题,理解了题意之后发现:只需要遍历把所有能加的战舰就加到数组里,结束时战舰数量−a+1−a+1就是答案,也就是说先把那个所有连续的0算一下,计算可以存放多少个战舰,因为是至少,所以我们假设我们的运气最差,前p.size()-a都没有战舰,那么p.size()-a+1肯定会有战舰。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int n, a, b, k;
cin >> n >> a >> b >> k;
string s;
cin >> s;
int cnt = 0;
vector<int> p;
for (int i = 0;i < s.size();i++)
{
if (s[i] == '0')
{
cnt++;
if (cnt == b)
{
cnt = 0;
p.push_back(i + 1);//之所以加1是因为下标是从0开始
}
}
else
{
cnt = 0;
}
}
cout << p.size() - a + 1<<endl;
for (int i = 0;i < p.size() - a + 1;i++)
{
cout << p[i]<<" ";
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 一生雾梦!
评论
ValineDisqus