[CF738D]Sea Battle(贪心)

题目链接:http://codeforces.com/contest/738/problem/D

题意:1*n的格子里有a条长为b的船。有一个人射了k发子弹都没打中船,现在问最少再打多少次一定能保证射到一搜。

统计出每一个子块中最多能多少条船,贪心地从左到右排列,记下船尾。假设有m条,那么除了m-a条船,剩下的位置一定能打中一条。就是打m-a+1个地方,随便打m-a+1个船尾就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 200200;
 5 int n, a, b, k;
 6 char s[maxn];
 7 vector<int> shoot;
 8 vector<int> seg;
 9 vector<int> bg, ed;
10 
11 int main() {
12     // freopen("in", "r", stdin);
13     while(~scanf("%d%d%d%d",&n,&a,&b,&k)) {
14         scanf("%s", s+1);
15         int cnt = 0;
16         seg.clear();
17         for(int i = 1; i <= n; i++) {
18             if(s[i] == '1') {
19                 cnt = 0;
20             }
21             else if(s[i] == '0') {
22                 cnt++;
23                 if(cnt == b) {
24                     seg.push_back(i);
25                     cnt = 0;
26                 }
27             }
28         }
29         int sz = seg.size();
30         printf("%d\n", sz);
31         sz = sz - a + 1;
32         for(int i = 0; i < sz; i++) {
33             printf("%d%c", seg[i], i == sz - 1 ? '\n' : ' ');
34         }
35     }
36     return 0;
37 }

 

posted @ 2016-11-20 20:35  Kirai  阅读(348)  评论(0编辑  收藏  举报