题目:
链接:https://www.nowcoder.com/questionTerminal/748b891f208744a7b1f98cb4c45bde11?questionTypes=000100&mutiTagIds=1727&page=1&onlyReference=false
来源:牛客网
最近小明搬到了新家,他正在粉刷墙壁,但是不幸的是他粉刷的墙壁并不理想。他的墙壁是一个长度为 \mathit nn的格子,每个格子用0表示红色,用1表示蓝色。现在墙壁是一个非常混乱的颜色。他想将墙壁涂成左边全是蓝色右边全是红色,可以将墙壁刷成全是红色或者蓝色。请问他至少需要粉刷多少个格子墙壁刷成他想要的样子?
分析:
1.全蓝或全红,遍历1或0;
2.动态规划,i为分割线,左边0的个数和右边1的个数和为需要粉刷的格子,因为左全为蓝(1),右全为红(0);然后从i开始统计与第一次的进行比较,最终就是至少需要粉刷的格子
代码如下:
#include<iostream>
using namespace std;
int main()
{
int sum;
string str;
//cout << "输入格子数:" << endl;
cin >> sum;
//cout << "输入布局(0,1):" << endl;
cin >> str;
int cout1=0;
for (int i = 0; i < sum; i++)//统计1的个数
{
if (str[i] == '1')
cout1++;
}
int min1=min(cout1, sum - cout1);//全蓝或红的最小
//左蓝(1),右红(0)情况
int left1=0;//统计左1的个数
for (int i = 0; i < sum; i++)
{
if (str[i] == '1')
{
left1++;
}
int min2 = i + 1 - left1 + cout1 - left1;//左0:i + 1 - left1;右1:cout1 - left1
if (min2 < min1)
{
min1= min2;
}
}
cout << min1;
return 0;
}