您的位置:首页 > 其它

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

2012-11-21 11:15 344 查看
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
;

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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: