CodeForces
来源:互联网 发布:点云数据英文 编辑:程序博客网 时间:2024/06/05 01:18
题意就是 在这个数串中插入1构成一个最长的连续1的区间串
如何做?我们可以对长度进行二分
从1到n二分长度 然后在对这个长度拿到数串中查看是否能构成最终我们想要的最长匹配串
这里我们可以利用一个前缀和数组 统计从1到i的0的个数 由于必然是递增数组 就满足了二分
的“有序”条件 。
#include<bits/stdc++.h>using namespace std;int a[300010],s[300010];int n,k,L;bool che(int x){ for(int i=1;i<=n;i++) { int r = i+x-1; if(r>n)return 0; if(s[r]-s[i-1]<=k){//如果s[r]-s[i-1]<=k说明这两个下标下之间0的个数<=k也就说满足条件 就会返回1 并记录区间左端点 L = i; return 1; } } return 0;}int main(){ cin>>n>>k; s[0]=0; for(int i=1;i<=n;i++){ cin>>a[i]; s[i]=s[i-1]+(a[i]==0); } int M=0,u=0; int l = 1,r=n; while(l<=r) { int mid = (l+r)>>1; if(che(mid)) {// 如果这里返回1 说明区间满足条件 就会记录长度 尝试更长的长度 u = mid; l = mid+1; } else r = mid-1;// 不满足条件 说明数串长度过长 需要截短 } for(int i=L;i<=L+u-1;i++) a[i]=1; cout<<u<<endl; for(int i=1;i<=n;i++) { cout<<a[i]; if(i==n)puts(""); else cout<<" "; } return 0;}
阅读全文
0 0
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- 机器学习中常用的矩阵求导公式
- java.lang.NoClassDefFoundError org/apache/commons/collections/FastHashMap
- hdu5510_Bazinga_(剪枝+kmp)
- Linux exec简介
- Html-行级标签
- CodeForces
- Linux netstat命令详解
- 走向云计算之Hadoop基本介绍及生态系统
- java培训第一天
- 计算机软件编程英语词汇集锦
- android binder机制,注册系统服务---Java层注册系统服务
- 矩阵求导计算法则 例题
- Allegro PCB简单操作(一)
- 使用XIB设置UILabel的换行及设置每一行的字体大小