首页 > 其他 > 详细

Educational Codeforces Round 96 (Rated for Div. 2) D. String Deletion (思维)

时间:2020-10-14 09:39:53      阅读:32      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:有一个\(01\)串,每次操作要先删除一个位置上的元素,然后删除相同前缀和,直到字符串被删完,问最多能操作多少次.

  • 题解: 对于一个长度大于\(1\)的相同前缀,我们最多只能对它操作一次,然后就整个直接被删除了,所以它能提供的贡献就很少,我们记录所有连续的串的长度,然后我们最理想的删除条件是,最前面是单个的数(连续串长度为\(1\)),在它后面有长度大于\(1\)的连续相同串,我们每次删除一个连续相同串的一个字符,然后最前面的再删除一个,实验过程看代码吧.

  • 代码:

        int t;
        int n;
        string s;
        vector<int> v;
    
        int main() {
            ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
            cin>>t;
            while(t--){
                cin>>n;
                cin>>s;
                v.clear();
                int cnt=1;
                for(int i=0;i<n-1;++i){
                    if(s[i]==s[i+1]) cnt++;
                    else{
                        v.pb(cnt);
                        cnt=1;
                    }
                }
                v.pb(cnt);
                int pos=0;
                int ans=0;
                for(int i=0;i<(int)v.size();++i){
                    ans++;
                    pos=max(pos,i);
                    for(;pos<(int)v.size() && v[pos]<=1;++pos);
                    // 3 1 1 1 
                    if(pos<(int)v.size() && v[pos]>=1){
                        v[pos]--;
                    }
                    else ++i;
                }
                cout<<ans<<endl;
            }
    
            return 0;
        }
    

Educational Codeforces Round 96 (Rated for Div. 2) D. String Deletion (思维)

原文:https://www.cnblogs.com/lr599909928/p/13812527.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!