【Codeforces Round #719 (Div. 3)】-E. Arranging The Sheep-前后缀

题目:
【Codeforces Round #719 (Div. 3)】-E. Arranging The Sheep-前后缀_第1张图片

分析:
既然每个星星都要聚成一堆
那么必定是前面的向后走
后面的向前走
不知道都走到哪才能得出结果
于是每个位置扫一遍就行了

思路:
开一个前缀一个后缀
分别表示前面的星星全聚到某个位置时需要几步
和后面的星星全聚到某个位置时需要几步
然后枚举每个空位置
维护一下最小值
缀的计算方式:如果当前位置是’.’,那么这个位置的值就是上一个位置的值+之前的星星个数。如果当前位置是’*’,那么这个位置的值就是上一个位置的值,且星星个数++

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define G 10.0
#define LNF 1e18
#define eps 1e-6
#define PI acos(-1.0)
#define ll long long
#define INF 0x7FFFFFFF
#define Regal exit(0)
#define Chivas int main()
#define pb(x) push_back(x)
#define SP system("pause")
#define ull unsigned long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define IOS ios::sync_with_stdio(false)
#define MEM(a, b) memset(a, b, sizeof(a))
#define each_cass(cass) for (cin >> cass; cass; cass--)
#define test(a) cout << "---------" << a << "---------" << '\n'
 
using namespace std;
 
inline void solve(){
     
    ll n;
    string s;

    cin >> n;
    cin >> s;

    ll fro[s.size() +10]={
     0};
    ll enn[s.size() + 10] = {
     0};

    ll cnt = 0;//走前缀
    for(ll i = 0; i < n; i++){
     
        if(i==0){
     
            fro[i] = 0;
            cnt += (s[i] == '*');//初位置一定是0,但是判断是否有星星
            continue;
        }
        if(s[i] == '*') cnt++, fro[i] = fro[i - 1];
        else fro[i] = fro[i - 1] + cnt;//全体星星向右移动一格
    }
    
    cnt = 0;//走后缀
    for(ll i = n - 1; i >= 0; i --){
     
        if(i == n - 1){
     
            enn[i] = 0;
            cnt += (s[i] == '*');//初位置一定是0,但是判断是否有星星
            continue;
        }
        if(s[i] == '*') cnt ++, enn[i] = enn[i + 1];//全体星星向左移动一格
        else enn[i] = enn[i + 1] + cnt;
    }

    ll res = LNF;
    for(ll i = 0; i < n; i ++){
     //枚举每个'.'的位置
        if(s[i] == '.'){
     
            if(i > 0) res = min(res, fro[i - 1] + enn[i]);
            if(i < n - 1) res = min(res, fro[i] + enn[i + 1]);
        }
    }
    if(res == LNF) res = 0;
    cout << res << endl;
}
 
Chivas{
     
    IOS;
    int cass;
    each_cass(cass){
     
        solve();
    }
    Regal;
}

你可能感兴趣的:(#,CodeForces)