请问这题贪心为什么不行?
查看原帖
请问这题贪心为什么不行?
174118
Novaorbit楼主2021/8/4 09:55

思路如下:

  1. 把输入的字符预处理为数字,方便后续操作
  2. 从 a[1] 开始,若当前位置 (poi1) 颜色与目标颜色不同,则从a[n]开始向前查找至与目标颜色不同的位置(poi2),将poi1至poi2之间的区间涂为poi1的目标颜色,涂色次数+1
  3. 继续步骤(2),直至poi1与poi2重合
  4. 此时,木板涂色完毕,输出涂色次数

附:C++代码如下

#include<bits/stdc++.h>
using namespace std;
int n,tpoi=1,a[55],tp,poi1=1,poi2,ans=1;
char c[5],tc;
int main()
{
	while(true)//对输入的处理
	{
		++n;
		tc=getchar();
		if(tc=='\n')
			break;
		switch(tpoi)
		{
			case 1:
				c[1]=tc;
				++tpoi;
				a[n]=1;
				break;
			case 2:
				if(c[1]==tc)
					a[n]=1;
				else
				{
					c[2]=tc;
					++tpoi;
					a[n]=2;
				}
				break;
			case 3:
				if(c[1]==tc)
					a[n]=1;
				if(c[2]==tc)
					a[n]=2;
				if(c[1]!=tc&&c[2]!=tc)
				{
					a[n]=3;
					c[3]=tc;
					++tpoi;
				}
				break;
			case 4:
				if(tc==c[1])
					a[n]=1;
				if(tc==c[2])
					a[n]=2;
				if(tc==c[3])
					a[n]=3;
				break;
		}	
	}
	tp=a[1];poi2=n-1;
	while(poi1!=poi2)//贪心过程 
	{
		while(a[poi1]==tp&&poi1!=poi2)
			++poi1;
		while(a[poi2]==tp&&poi1!=poi2)
			--poi2;
		if(poi1!=poi2)
		{
			ans++;
			tp=a[poi1];
		}
	}
	if(a[poi1]!=tp)
		ans++;
	cout<<ans;
	return 0;
}
2021/8/4 09:55
加载中...