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;
}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务