SGU 170.Particles

Solution:

              这其实是道很简单的题。

              只要从一端开始,以‘+’或‘-’,任意一种开始找,找到与目标串最近的相同字符的距离就是需要交换的次数。

              +++———            对齐第一个‘-’                  —+++——

                                        ------------> 

              ———+++                                                ———+++

 

              以‘-’为例,不断向一端交换的话,最后交换的其实只要当前的‘-’和一个‘+’的位置,其他‘-’的相对位置不变。

              因此只要从左到右匹配第i个‘-’,计算出它们的距离差,累加即可。

 

code:

         

#include <iostream>
#include <string>
#define abs(x) (max(x,-(x)))
using namespace std;
const int INF = 5555;
int  len, a[INF], b[INF], n1, n2, ans;
string st;
int main() {
	cin >> st;
	len = st.size();
	for (int i = 0; i < len; i++)
		if (st[i] == '-') a[++n1] = i;
	cin >> st;
	for (int i = 0, t = 0; i < len; i++)
		if (st[i] == '-') b[++n2] = i;
	if (n1 != n2) {
		cout << -1;
		return 0;
	}
	for (int i = 1; i <= n1; i++)
		ans += abs (a[i] - b[i]);
	cout << ans;
}

  

转载于:https://www.cnblogs.com/keam37/p/3849933.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值