http://www.lydsy.com/JudgeOnline/problem.php?id=3016
之前yy了一个贪心,,,但是错了,,就是枚举前后对应的字符(前面第i个和后面第i个)然后相同答案就+1,否则不操作。。
QAQ
然后看了题解。。。神。。
首先序列肯定是偶数个,然后。。一定有n/2个‘(’,和n/2个‘)’
那么左边的一定都是‘(’,对于每一个‘(’,右边的一定有一个‘)’,所以我们想到差分,当右边多了‘)’,那么就要累计答案+1,维护一个sum,如果是‘(’就+1,‘)’就-1,按上边说的操作,即当sum<0的时候ans+1,然后sum要+=2(就相当于sum=1,即左边有一个‘(’),然后最后可能还剩余‘(’,所以我们将答案加上sum/2即可
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr2(a, b, c) for1(i, 1, b) { for1(j, 1, c) cout << a[i][j]; cout << endl; } #define printarr1(a, b) for1(i, 1, b) cout << a[i]; cout << endl inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } inline const int max(const int &a, const int &b) { return a>b?a:b; } inline const int min(const int &a, const int &b) { return a<b?a:b; } int sum, ans; int main() { while(1) { char ch=getchar(); if(ch!='('&&ch!=')') break; if(ch=='(') ++sum; else --sum; if(sum<0) ++ans, sum+=2; } ans+=sum>>1; print(ans); return 0; }