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