题目链接: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 ", sz); 31 sz = sz - a + 1; 32 for(int i = 0; i < sz; i++) { 33 printf("%d%c", seg[i], i == sz - 1 ? ' ' : ' '); 34 } 35 } 36 return 0; 37 }