一,思路:直接从左到右枚举即可,用两个变量来维护左边的0的个数,右边1的个数。这题可能你会把四舍五入看成向上取整导致错误。
二,代码:
#include <iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
void Solved() {
int n;
cin>>n;
string str;
cin>>str;
vector<int> res;
//统计全部的1和0的个数
int sum0=0,sum1=0;
for(int i=0;i<n;i++){
if(str[i]=='0') sum0++;
if(str[i]=='1') sum1++;
}
//特判1号房屋前面的情况,记得要化为小数处理和四舍五入
double t1=n*1.0/2;
if(sum1>=round(t1)) res.push_back(0);
sum0=0;
for(int i=0;i<n;i++){
//左边零的个数
if(str[i]=='0') sum0++;
//右边一的个数
if(str[i]=='1') sum1--;
double t2=(i+1)*1.0/2,t3=(n-(i+1))*1.0/2;
if(sum0>=round(t2)&&sum1>=round(t3)) res.push_back(i+1);
}
int idx=-1;
double mi=1e9;
//找距离中间村庄最近的房屋是在哪里
for(int i=0;i<res.size();i++){
double t=n*1.0/2;
if(abs(t-res[i])<mi){
idx=res[i];
mi=abs(t-res[i]);
}
}
cout<<idx<<endl;
}
int main()
{
int t;
cin>>t;
//t=1;
while(t--) {
Solved();
}
return 0;
}