课程总结———暴力(枚举法)
作者:互联网
暴力(枚举法)
-
1)枚举定义:当我们事先知道结果或某约束条件的范围时,如果范围不是很大我们就用枚举法,枚举通俗称为"暴力",也称为穷举。
-
2)例题: 破碎的项链
-
3)自我理解:
一,"r"代表红色的珠子,"b"代表蓝色的珠子,"w"代表可以变换颜色的珠子。
二,题目要求把链子拆开(可以在任何地方拆开)从左往右数,最多能数几个颜色相同的珠子,从右往左数,最多能数几个颜色相同的珠子,左右一起最多能数几个珠子。
三,输出最多的珠子数。 -
4)思路:
首先,输入n,表示链子的长度,输入s1,表示每个珠子的颜色;接着枚举起点i,判断不为w时,再开两个循环:一个枚举从前往后数的个数,存到sum里;一个枚举从后往前数的个数,存到num里。两个数加起来和sub打擂台。循环结束,输出sub; -
5)话不多说,上代码:
先是输入:
cin>>n;
cin>>s1;
s2=s1+s1;//处理环形;
核心代码:
for(int i=0;i<n;i++){//因为是字符串所以要从0开始枚举
if(sdc==n)//两个特殊情况,这个全是w,输出n;
{
sub=n;
break;
}
if(sum==n)//这个是全是r或全是b时,输出n;
{
sub=n;
break;
}
if(s2[i]=='w')//如果开头是w时,累加并直接下一个
{
sdc++;
continue;//跳过本次循环
}
if(s2[i]!='w')//满足不为w
{
sum=0;//计数器清零;
num=0;//同上
l=s2[i];//存入第一个不为w的数
for(int f=i+n-1;f>0;f--)//特殊情况
{
if(s2[f]!='w')//当i+n-1的数不为w时再存入k;
{
k=s2[f];
break;
}
}
for(int j=i;j<=i+n-1;j++){//累加过程
if(s2[j]==l||s2[j]=='w') sum++;
else break;
}
for(int j=i+n-1;j>=sum;j--){//累加过程
if(s2[j]==k||s2[j]=='w') num++;
else break;
}
if(sum+num>sub) sub=sum+num;//打擂台
}
}
cout<<sub;//输出
-6)总结:
这道题虽然不算太难,但细节较多,比如循环的次数,累加器的清零等;暴力解题,个人认为还是比较实用的,但细节太多,需要谨慎。
标签:暴力,枚举法,s2,sum,枚举,break,珠子,课程,sub 来源: https://blog.csdn.net/qq_55395656/article/details/114452725