题目:
给出长为n<2*1e5的数组,给出区间个数a<n,每个区间长度b<n,求用多少个点可以使得至少有一个区间被覆盖。
题解:
在每个区间长度的最后一个位置放一个点,直到剩下可放置的区间数量小于b。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int n,a,b,k;
string str;
int arr[201000];
vector<int> vec;
int main(){
cin>>n>>a>>b>>k;
cin>>str;
for(int i=0;i<n;i++){
arr[i]=(int)(str[i]-'0');
}
arr[n]=1;
int last=-1;
int now=0;
int maybe=0;
for(int i=0;i<=n;i++){
if(arr[i]){
maybe+=(i-last-1)/b;
last=i;
}
}
int need=maybe-a+1;
last=-1;
for(int i=0;i<=n;i++){
if(arr[i]){
last=i;
}
else if(i-last-1==b-1){
vec.push_back(i+1);
last=i;
need--;
if(!need) break;
}
}
cout<<vec.size()<<endl;
for(int i=0;i<vec.size();i++){
cout<<vec[i];
if(i==vec.size()-1) cout<<endl;
else cout<<' ';
}
}