C++| 通俗逻辑题解
刷墙
http://www.nowcoder.com/questionTerminal/748b891f208744a7b1f98cb4c45bde11
逻辑比较好想,刷两遍
vector blue,res记录在每一格需要刷的红蓝数量
blue从左开始,看见0就说明要刷,blue[i] = blue[i]+1
red从右开始,看见1就++;
然后计算min(blue[i]+red[i], res),找出在哪一格,需要刷的墙最少
最后将res--,这是因为在i点,蓝的要刷成蓝,红的要刷红肯定重复刷了一次,所以减去1
int main() {
int n;
cin >> n;
string arr;
cin >> arr;
// 左蓝右红,蓝1红0
// 需要刷蓝的个数
vector<int> blue(n,0);
for(int i = 0; i < n; i++) {
if(i == 0)
blue[0] = (arr[0] == '0');
else
{
if(arr[i] == '0')
blue[i] = blue[i-1]+1;
else
blue[i] = blue[i-1];
}
}
// 需要刷红的个数
vector<int> red(n,0);
for(int i = n-1; i >= 0; i--) {
if(i == n-1)
red[n-1] = (arr[n-1] == '1');
else
{
if(arr[i] == '1')
red[i] = red[i+1] + 1;
else
red[i] = red[i+1];
}
}
int res = INT_MAX;
for(int i = 0; i < n; i++) {
res = min(res, blue[i] + red[i]);
}
res--;
cout << res << endl;
}