Educational Codeforces Round 90 (Rated for Div. 2) C. Pluses and Minuses 题解(思维)

题目链接

题目大意

就是执行这个伪代码

res = 0
for init = 0 to inf
    cur = init
    ok = true
    for i = 1 to |s|
        res = res + 1
        if s[i] == '+'
            cur = cur + 1
        else
            cur = cur - 1
        if cur < 0
            ok = false
            break
    if ok
        break

Ⅰ.当cur小于0时会终止当前for循环,然后cur初始值加一,重新开始一遍

Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序Ⅱ.当cur始终大于0时会跑满for循环,然后直接退出程序

题目思路

主要是要发现每次break的位置符合递增。

代码

#include
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int mod=1e9+7;
int t,a,b,c;
char s[maxn];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%s",s+1);
        int d=strlen(s+1),pre=0,mi=0;
        ll ans=0;
        for(int i=1;i<=d;i++){
            if(s[i]=='+'){
                pre++;
            }else{
                pre--;
            }
            if(pre<mi){
                mi=pre;
                ans+=i;
            }
        }
        ans+=d;//序列全部执行
        printf("%lld\n",ans);
    }
    return 0;
}

你可能感兴趣的:(思维)