Codeforces 327A - Flipping Game

在这里插入图片描述
题目给了我们一组数,要我们求一次变换(即对一个范围内的数字,0变1,1变0)之后,能得到的最大的1的个数。因为数据<=100,所以暴力是能过的,但是同样我们可以动态规划,找出更优秀的解法。

  1. 暴力
#include<iostream>
using namespace std;
int  main()
{
	int t,num[105];//用数组存储数据
	cin>>t;
	for(int a=0;a<t;a++)
		cin>>num[a];
	int count=0;
	for(int a=0;a<t;a++)//遍历,从头开始,把1和0都变了
	 {
		for(int b=a;b<t;b++)
		{
			int temp=0;//存对应情况的变化后1的个数
			for(int c=a;c<=b;c++)
			{
				if(num[c]==0)
				num[c]=1;
				else if(num[c]==1)
				num[c]=0;
			}
			for(int d=0;d<t;d++)
			{	
				if(num[d]==1)temp++;
			}
			if(temp>=count)
			count=temp;//count取最大值
			for(int c=a;c<=b;c++)//记得变回来,不然下次就物是人非了
			{
				if(num[c]==0)
				num[c]=1;
				else if(num[c]==1)
				num[c]=0;
			}
		}
	 } 	
		cout<<count;
		return 0;
 } 

2.动态规划
我们实际上就是要求最多可以变的0的个数,我们可以想办法把他求出来,在这里,我用s1存储1的个数,用s0存储可以变化的0的最大个数
比如说1 0 0 1 1 0
我们肯定只变中间的一段
得到1 1 1 1 1 0
答案是5
我们取s0,一旦有0,便加上一,从此后,遇见1,便减去一,时刻取最大的s0,
这里需要思考;基本思路就是这样

#include<iostream>
using namespace std;
int main()
{
	int t,s0=0,s1=0,temp=0;cin>>t;
	int n=t;//n用于之后,表示数字个数
	while(t--)
	{
		int x;cin>>x;
		if(x)//如果x是1的话
		{
			s0--;
			s0=max(s0,0);//s0肯定非负
			s1++;
		}
		else
		{
			s0++;
			temp=max(s0,temp);
		}	
	 } 
	 if(s1==n)//因为至少要变一次,所以对应全是1的情况,我们必须减1输出
	 cout<<n-1;
	 else
	 cout<<temp+s1;//1的个数加上可以变得0的个数
	 return 0;
}
发布了9 篇原创文章 · 获赞 0 · 访问量 217

猜你喜欢

转载自blog.csdn.net/qq_45773977/article/details/104518605