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;

}

  

你可能感兴趣的:(round)