【AtCoder - 5659 】>< (思惟題)

><

直接寫中文了c++

Problem Statementspa

給定的是長度爲N-1的字符串S. S中的每一個字符都是<或>。.net

當對全部i(1≤i≤N-1)都知足如下條件時,N個非負整數a1,a2,[cdots],aN的序列被認爲是知足的code

  • 若是Si = <:ai <ai + 1
  • 若是Si =>:ai> ai + 1

找出N個非負整數的良好序列的元素的最小可能和。blog

約束條件ci

  • 2≤N≤5×105
  • S是長度爲N-1的字符串,由<和>組成

Input字符串

輸入來自標準輸入,格式以下:get

S

Outputstring

找出N個非負整數的良好序列的元素的最小可能和。it

Sample Input 1

<>>

Sample Output 1

3

a =(0,2,1,0)是一個好序列,其總和爲3。沒有一個好序列,其總和小於3

Sample Input 2

<>>><<><<<<<>>><

Sample Output 2

28

題目連接:
https://vjudge.net/problem/AtCoder-5659

 

不難發現找到"<>"這個便可

"<>"左右兩邊的個數設爲l,r;大的一個爲maxn,小的一個爲minn ,則兩邊的和爲(maxn+1)/2*maxn+(minn+1)/2*minn-minn

"><"左右兩邊的個數設爲l,r;兩邊的和爲(l+1)/2*l+(r+1)/2*r

因此只要遍歷一遍s便可,碰到"<>"另外討論,其餘狀況假設有n個"<"或者">",則ans+=(n+1)/2*n;

AC代碼

#include <bits/stdc++.h>
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x, y) memset(x, y, sizeof(x))
#define Maxn 1000000000000 + 10
using namespace std;
string s;
ll len;
ll ans;
void solve(ll start, ll sum, ll flag) //搜索起始位置,上一次共有sum個連續的<或者>,上一次有沒有出現<>
{
    ll i;
    ll f = 0;
    ll cnt = 1; //計數
    char r = s[start];
    for (i = start + 1; i < len; i++)
    {
        if (s[i] == r)
            cnt++;
        else
        {
            if (r == '<' && s[i] == '>') //存在<>,f=1
                f = 1;
            break;
        }
    }
    if (flag == 1)
    {
        if (cnt > sum)
        {
            if (cnt > 1)
            {
                ans += (cnt + 1) * cnt / 2;
                ans -= sum;
            }
            else
            {
                ans += 1;
                ans -= sum;
            }
        }
        else
        {
            if (cnt > 1)
            {
                ans += (cnt + 1) * cnt / 2;
                ans -= cnt;
            }
            else
            {
                ans += 1;
                ans -= cnt;
            }
        }
        if (i >= len)//遍歷完成
            return;
        return solve(i, cnt, f);
    }
    else
    {
        if (cnt > 1)
            ans += (cnt + 1) * cnt / 2;
        else
        {
            ans += 1;
        }
        if (i >= len)//遍歷完成
            return;
        return solve(i, cnt, f);
    }
}
int main()
{
    ans = 0;
    cin >> s;
    len = s.size();
    solve(0, 0, 0);
    cout << ans << endl;
}
相關文章
相關標籤/搜索