• CF1428C


    Description

    有一个只包含'A'与'B'的字符串,每次可以消掉一个 “AB” 或一个 “BB”,并把剩下的拼在一起,求字符串最短的长度。


    题意已经够简洁了;

    这是今天校内魔泥赛唯一一道水题。


    Solution

    1.

    可以用栈维护元素。

    这里推荐用 STL 里的 stack,可能有点慢,但是好用也不会超时;

    手写栈清空时直接把头指针归零就好了,memset 遇到大数据会被卡。

    2.

    如果用贪心做此题,要注意修改的优先性。

    一定是先消除所有的 “AB”,再消除剩下的 “BB”。

    正确性证明:

    如果优先消除 “BB”,可能会出现剩余的 “A” 无法被消除的情况。

    比如 “AAAABBBB”,正确的做法是每一个 “A” 与“B”组队消除,剩下的依次拼接消除,答案是 0;

    如果优先消除了 “BB” 或者遇到哪一对消除哪一对,可能会有 “A” 剩余,剩下 “AAAA” 或者 “AA” 的情况,而这并不是最短的。


    我用的 STL 维护栈毕竟好写

    Code

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<stack>
    
    using namespace std;
    
    int t;
    string a;
    stack<int> st;
    
    int read(){
    	int s=0,w=1;
    	char ch=getchar();
    	while(ch<'0' ||ch>'9'){
    		if(ch=='-') w=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
    	return s*w;
    }
    
    int main(){
    	t=read();
    	for(int i=0;i<t;i++){
    		cin>>a;
    		int tot=a.length();
    	    st.push(a[0]);
    	    for(int j=1;j<tot;j++){
                if(st.size()){
    	    	    if(a[j]=='B' &&((char)st.top()=='A'||(char)st.top()=='B')){
    	    		    st.pop();
    	    	    	continue;
    			    }
    			}
    			st.push(a[j]);
    		}
    		printf("%d
    ",st.size());
    		while(st.size()) st.pop();
    	}
    	return 0;
    }
    

  • 相关阅读:
    计算机基础
    如何增加一个IT产品的用户黏性
    计算机相关专业一门课程一个案例
    【2012年6月14日】中兴发布Grand(智观)N970
    bmp格式浅析
    3Dbook的使用
    中英文翻译格式
    软件学习书籍推荐
    WEB开发基础
    PHP学习
  • 原文地址:https://www.cnblogs.com/KnightL/p/13935228.html
Copyright © 2020-2023  润新知