1659.社交距离I(二分)
输入样例:
14
10001001000010
输出样例:
2
二分哪!!!求添加两头牛之后 牛栏之间的最小距离 最小,就假设牛栏之间的最小距离为x,看添加的牛的数量是否可以大于等于2
二分+判断 比条件分析要OK得多,后者很容易一团糨糊
#include <bits/stdc++.h>
using namespace std;
int n,T,k,m;
const int N=1e5+5;
int a[N];
// vector<int> a;
string str;
bool adequate(int x){//添加两头牛之后 牛栏之间的最小距离为x
int cnt=0;//满足x的条件下最多可以插入几头牛
int pre=1-x;//上一头牛的位置
for(int i=1;i<=n;i++){
if(str[i]=='1'){
// if(pre+x+x<=i)cnt++;//上一个1(位置在pre),和这个1(位置在i)看能插入多少牛
// pre=i;
while(pre+x+x<=i){
cnt++;
pre=pre+x;
}
pre=i;
}
}
while(pre+x<=n)pre+=x,cnt++;
return cnt>=2;
}
signed main(){
cin>>n;
cin>>str;
str="#"+str;
int l=1,r=n;
int num=0;
int f=0;
for(int i=1;i<=n;i++){//计算每两头牛之间的距离 0001这种不算噢
if(str[i]=='1'&&f){
r=min(r,num+1);
num=0;
}
else if(str[i]=='1'&&!f){
f=1;
num=0;
}
else num++;
}
// 1001 num个0还得加1才是距离3
while(l<r){
int mid=(l+r+1)/2;
if(adequate(mid)){
l=mid;
}
else r=mid-1;
}
cout<<l;
return 0;
}
也可以用一个数组记录每头奶牛的位置,
bool check(int x) {
int p=1-x,cnt=0;//cnt不一定恒等于2,小于2代表方案不合理,大于等于2代表方案合理
for(int i=1; i<=m; i++) {
while(p+x+x<=a[i]) p+=x,cnt++;//如果符合条件,p就往后移动x的距离,牛的头数就加一头
p=a[i];//令p=a[i],p就是前一头牛的位置
}
while(p+x<=n) p+=x,cnt++; //因为存在插入位置没包含最后一个位置n的情况,所以需要继续往后加牛,直到加到不能加位置
return cnt>=2;//如果加入的牛的数量大于等于2,证明我们的方案是可行的,即x是一种答案
}
for(int i=1;i<=n;i++){
if(str[i]=='1'){
a[++m]=i;
}
}
for(int i=1; i<m; i++) r=min(r,a[i+1]-a[i]);
尝试条件判断分类讨论,非常凌乱+过不了
#include <bits/stdc++.h>
using namespace std;
int n,T,k;
// const int N=1e5+5;
// int a[N];
vector<int> a;
signed main(){
string str;
cin>>n;
cin>>str;
int cnt=0;
int f1,f2;
f1=f2=0;
if(str[0]=='0')f1=1;
for(int i=0;i<n;i++){
if(str[i]=='0')cnt++;
else if(str[i]=='1'&&i>=1&&str[i-1]=='0'){
a.push_back(cnt+1);
cnt=0;
}
else continue;
}
if(str[n-1]=='0'){
f2=1;
// a.push_back(cnt);
}
// 首尾存在一段0,可以直接放在首尾
if(a.size()==0){//全0,因为遇见1才将这个1和前一个1的距离存入数组的
cout<<n-1;
return 0;
}
else if(a.size()==1){//不考虑str[0],只有一个1
if(!f1&&!f2)cout<<a[0]/3;//首尾是1 100001
else if(f2){//10001000 或者0001000
if(!f1){//10001000
cout<<min(cnt,)
}
else{
cout<<min(cnt,a[0]);
}
}
return 0;
}
sort(a.begin(),a.end());
int s=a.size()-1;
a[s]=a[s]/2;
a[s-1]=a[s-1]/2;
sort(a.begin(),a.end());
cout<<a[0];
return 0;
}