题意:给你一个字符串, 求把所有 ‘*’ 放在一起的最小移动次数,一次仅能向左或向右移动到空地 ‘.’
思路:就是对每一个 星号 都存一下它前边 ‘.’ 的数目,求中间位置的星号和其他位置的差值
大佬的思路就是妙啊
举几个例子就能明白这个代码的思路
#include<bits/stdc++.h>
using namespace std;
vector <int> v;
string s;
int main()
{
int t, n;
cin >> t;
while(t--)
{
v.clear();
cin >> n;
cin >> s;
int cnt = 0;
for(int i = 0 ; i < n; ++i)
{
if(s[i] == '.') ++cnt;
else v.push_back(cnt);
}
//if(s[n - 1] == '.') v.push_back(cnt);
int mid = (v.size() - 1) / 2;
long long ans = 0;
for(int i = 0; i < v.size(); ++i)
ans += abs(v[i] - v[mid]);
cout << ans << endl;
}
return 0;
}
/*
1
29
...****....****......****...*
*/