E. Arranging The Sheep
哎本来今天不想继续补了。
不如咕咕咕了吧?咕咕咕了吧?快给我咕咕咕啊!
题目传送门:
题面:
题目大意:
给你一个字符串,只有 . . .和 ∗ * ∗两种字符,每次可以移动一个 ∗ * ∗,使用最小的移动步数,使最终所有的’ ∗ * ∗集中在一起。
思路:
中位数定理
给定数轴上的n个点,找出一个到它们的距离之和尽量小的点。这些点的中位数就是目标点。
那么本题思路:找到中间的那个星号,让其他点都凑到这个点。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int a[maxn];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
string str;
cin >> str;
int cnt = 0;
for (int i = 0; i < n; i++) {
if (str[i] == '*')
a[cnt++] = i;
}
int mid=cnt/2;
//中位数定理
ll sum=0;
for(int i = 0; i < cnt; i ++ )
{
sum += abs(a[mid] - a[i]) - abs(mid - i);
//物理绝对距离+其中隔着的*个数。
}
cout << sum << endl;
}
}
卡点:sum记得开longlong。