C. Pluses and Minuses(思维)

本文介绍了一种通过模拟伪代码遍历字符串并进行剪枝优化的方法,以避免不必要的计算,提高算法效率。该方法在遇到特定条件时,记录当前位置和累积值,从而跳过后续重复计算,实现算法加速。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 当然像蒟蒻的我会在这个题上模拟一边伪代码,如果程序没有跳出的话,说明当前 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值