刷墙问题(牛客网)C++

题目:
链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值