题目大意:移动羊使得羊在一起,输出最少的移动次数
思路:贪心选定中间的羊,让两边的羊向中间靠拢。
代码实现:
向量v中存储的是从最左边到该羊之间存在多少空格。所以相减得到的是两只羊之间存在的空格数量。两只羊u,v之间的某只羊移动并不会改变两只羊u,v之间的空格。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int _;
scanf("%d",&_);
while(_--){
int n,cur=0;
string s;
vector<int> v;
cin>>n;
cin>>s;
for(auto i:s){
if(i=='.') ++cur;
else v.push_back(cur);
}
if(v.empty()){
cout<<'0'<<endl;
continue;
}
int m=v[v.size()/2];
ll ans = 0;
for(auto k:v){
cout<<k<<" ";
ans += abs(k-m);
}
cout<<endl<<ans<<endl;
}
return 0;
}