直接寫中文了c++
Problem Statementspa
給定的是長度爲N-1的字符串S. S中的每一個字符都是<或>。.net
當對全部i(1≤i≤N-1)都知足如下條件時,N個非負整數a1,a2,[cdots],aN的序列被認爲是知足的code
找出N個非負整數的良好序列的元素的最小可能和。blog
約束條件ci
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; }