链接:
https://codeforces.com/problemset/problem/1520/E
题意:
给一个字符串,'*'代表羊,'.'代表空,让所有的羊站成一排,意为每个羊中间都没有空,每次只能让一只羊动一步,问最少多少步可以让所有的羊站成一排。
本题只要记录所有羊的位置,然后所有羊都向中间的羊靠拢即可,如果有偶数只羊,那选两只羊的哪一只都可以。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
using namespace std;
typedef long long ll;
int position[1000003];
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
string s;
cin >> s;
int cntshp = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '*') {
position[cntshp++] = i;
}
}
int center = (cntshp >> 1);
ll ans = 0;
for (int i = 0; i < cntshp; i++) {
if (i == center) {
continue;
}
else {
ans += (abs(position[center] - position[i]) - abs(center - i));
}
}
cout << ans;
cout << endl;
}
}