zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    Android应用的跨语言调用小结
    用户体验技术优化系列(一)
    富客户端开发技术选型
    全年工作总结
    暗黑破坏神2:Tab打开地图就变卡顿解决办法
    winform使用post方式启动IE传递数据
    winform listbox 显示tooltip(防闪烁)
    android代码混淆
    android singleTask问题
    android在activity中锁屏解锁后重走OnCreate的问题的解决办法
  • 原文地址:https://www.cnblogs.com/KnightL/p/13935228.html
Copyright © 2011-2022 走看看