CROC-MBTU 2012, Elimination Round (ACM-ICPC) E YY题目

http://codeforces.com/problemset/problem/245/E

题意:

给出一个序列包括'+' '-'两个字符,+表示有人进入该房间,-表示有人离开该房间。这里保证没有同时进出的。求进入过房间的人的最小数目。

思路:

ym那些大牛们这么快就AC了,这题真是考思维的,哎,弱爆了。。

我们考虑,如果遇到‘-’表明肯定有人在房间,并且要出去。所以每当遇到‘-’时,我们只要检查记录里面是否有+,如果有的话,就表明这个人出去,如果没有,就说明原来屋子里有个人我们没有记录,现在要出去了,只要+1即可。我们的到的保持进屋子的最大长度的‘+’序列就是答案。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)

#define ll long long
#define inf 0x7f7f7f7f
#define MOD 1073741824
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 107
#define N 307
using namespace std;
//freopen("data.in","r",stdin);

char str[N];

int main(){
    int i;
    int jn,jm;
    //freopen("din.txt","r",stdin);
   scanf("%s",str);
   jn = jm = 0;
   int len = strlen(str);
   int ans = 0;
   for (i = 0; i < len; ++i)
   {
       if (str[i] == '+') ans++;
   }
   if (ans == len || ans == 0)
   {
       printf("%d\n",len);
   }
   else
   {
       ans = 0;
       for (i = 0; i < len; ++i)
       {
           if (str[i] == '-')
           {
               if (jn == 0){
                   ans += 1;
               }
               else{
                   jn--;
               }
           }
           else
           {
               jn++;
               ans = max(ans,jn);
           }
       }
       printf("%d\n",ans);
   }
   return 0;
}

  

posted @ 2012-11-21 11:15  E_star  阅读(182)  评论(0编辑  收藏  举报