题目分析:
最终要使a*l+b最大 那么不管怎么取最后l的总和不会改变 因此只需要考虑b即可
当b>0时 尽量让多走几步 从而和要大 当b<0时 尽可能地少走几步 那么怎么才能少走几步呢
一段连续的0或者1是可以被擦掉的 那么最少的方案就是 先将01段中较少的给擦了然后再擦另外一个
那么怎么提出01段呢
unique函数就派上了用场
unique的作用是“去掉”容器中相邻元素的重复元素,这里去掉要加一个引号,为什么呢,是因为它实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址(是地址!!)
ex.
int num[10]={1,1,2,2,2,3,4,5,5,5};
int ans=unique(num,num+10)-num;
此时返回的ans为5
而num中前5项就是1,2,3,4,5
令 x=unique(s.begin(),s.end())-s.begin();
去重后的段要么是奇数 要么是偶数
偶数时 0和1的个数必然相同 那么答案就为(x/2+1);
奇数时 要么0少 要么1少 x/2向下取整后即为少的那一个 再加一即可
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,a,b;
cin>>n>>a>>b;
string s;
cin>>s;
int x=unique(s.begin(),s.end())-s.begin();
if(b>0) cout<<n*(a+b)<<endl;
else cout<<n*a+(x/2+1)*b<<endl;
}
return 0;
}