Plus-Minus Split

文章讨论了如何在给定的只包含+和-的数列中,通过最优拆分策略来最小化总成本,即子序列长度乘以其和的绝对值。关键思路是合并可抵消的符号,最后剩余的单独符号数量决定了总成本。
摘要由CSDN通过智能技术生成

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;
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值