Hello 2024
B. Plus-Minus Split
题目链接
题意:
给你n和长度为n的仅包含"+“或”-“的字符串,字符串描述了一个数列,第i个字符为”+"表示+1,否则表示-1。
现在你要把这个数列拆成多个连续子序列,每个序列的代价是序列长度 乘以 子序列所有数和的绝对值,问总的代价之和最小是多少。
思路:
很容易想到序列之和为0肯定是最好的,这样+ -数量相同。这是如果有一个+或-加入到这个序列中,而且无法被消去,那么肯定还是把原序列和这个符号拆开最好,让这个符号单独在一个序列里。
所以我们把能够抵消的符号放在一起,不能抵消的单独放,问题在于怎么找到这些单独放的符号。
可以想到相邻的不同符号先合并,这时候如果这个合并后的序列两边还是不同符号,那肯定还是可以合并的,中间的序列相当于"不存在",那么肯定只要+ -还都存在,就可以一对一消去,最后消到只剩一种符号,也就是结果剩下+ -数量之差个单独放,代价就是+ -数量之差。
code:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int T,n;
char ch;
int main(){
cin>>T;
while(T--){
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
cin>>ch;
if(ch=='+')ans++;
else ans--;
}
cout<<abs(ans)<<endl;
}
return 0;
}