C. Pluses and Minuses(思維)

 當然像蒟蒻的我會在這個題上模擬一邊僞代碼,如果程序沒有跳出的話,說明當前 cur 沒有跑遍 s 數組就已經變成了負數,所以在下一次循環中 ,也就是 cur+1 的值仍能跑到當時 cur 跑到的地方,我們記下 cur 跑到的位置,以及在 cur 遍歷數組過程中 res 增長的值 即可,思想類似於剪枝

const int N=1e6+5;
 
    int n,m,t;
    int i,j,k;
    char s[N];
    
int main()
{
    IOS;
    rush(){
        cin>>s+1;
        int len = strlen(s+1);
        ll res = 0; //保存答案,注意數據類型
        int pos = 1; //上一次的位置
        int val = 0; //記錄上一次 cur 跳出時的值,應該是 -1
        int tmp = 0; //記錄 cur 遍歷過程中,res 的增長值
        for(int init=0;init<=inf;init++)
        {
            int cur = val;
            bool ok = true;
            //debug(tmp);
            res += tmp;
            //tmp=0;
            for (int i=pos;i<=(len);i++){
                tmp = tmp + 1;
                if (s[i] == '+')
                    cur = cur + 1;
                else
                    cur = cur - 1;
                //debug(cur);
                if (cur < 0){
                    pos = i+1; //直接從下一個位置開始遍歷
                    val = cur+1;
                    //cout<<-1<<endl;
                    //debug(pos);debug(val);
                    ok = false;
                    break;
                }
            }  
            if (ok) break;
        }
        cout<<res+tmp<<endl; //最後遍歷完成 tmp==len
    }
    //PAUSE;
	return 0;
}

 更簡潔的 AC 代碼:

const int N=1e6+5;

    int n,m,t;
    int i,j,k;
    char s[N];
int main()
{
    //IOS;
    rush(){
        cin>>s+1;
        int len=strlen(s+1);
        ll res=0,cur=0;
        for(i=1;i<=len;i++){
            if(s[i]=='+') cur++;
            else cur--;
            if(cur<0) res+=i,cur=0;
        }
        cout<<res+len<<endl;
    }
    //PAUSE;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章