数据范围不大,我们就枚举,以当前的左括号为开始可以产生多少组符合条件的括号对。
如果右括号的数量大于左括号的数量,则break;
否则的话判断左括号和右括号的数量关系,我们把当前左括号的数量设置为sum,其他后面的左括号数量设置为oth,
如果多余的右括号小于oth,则跟当前的左括号组不成匹配对,我们继续往下找;
如果某一点时多余右括号的数量和oth相等了,ans++;
如果某一点时多余右括号的数量比oth大了,我们再跟sum 作比较,如果小于等于sum,则ans += yu+1;否则ans += sum+1;
完整代码如下:
#include<iostream>
using namespace std;
long long shu[1010];
int main(){
int n;
cin >> n;
long long ans = 0;
for(int i=1;i<=n;i++) cin >> shu[i];
for(int i=2;i<=n;i+=2){
long long sum;//当前多余的左括号
long long oth;//后续多余的左括号
if(shu[i]<=shu[i-1]){// 左括号多
ans += shu[i];
oth = 0;
sum = shu[i-1] - shu[i];
}
else{//右括号多,跳过
ans += shu[i-1];
continue;
}
for(int j=i+2;j<=n;j+=2){
if(shu[j] < shu[j-1]){
oth += shu[j-1] - shu[j];//累加多余的左括号
}
else{
long long yu = shu[j] - shu[j-1];//当前多余的右括号
if(yu < oth) oth -= yu;
else{
yu -= oth;
oth = 0;//不要忘记置零
if(sum>=yu){//可以组成 yu+1 组括号对
ans += yu + 1;
sum -= yu;
}
else{//可以组成 sum+1 组括号对
ans += sum + 1;
break;
}
}
}
}
}
cout << ans << endl;
return 0;
}