寒假训练day1:Educational Round 101 (Rated for Div. 2)

A题:https://codeforces.com/contest/1469/problem/A

题意:给定一个由'('、'?'、')'组成的字符串,若可以通过将'?'改变为'('或者')',使得该字符串序列为合法的括号序列,则输出"Yes",否则输出"No",(注意本题说明,该字符串是只出现一对'('')',其余全部都是'?')

思路:

  首先分析输出"No"的情况为:

    1.字符串的长度是奇数

    2.若')'出现在字符串的首部,或者'('出现在字符串的尾部,均不能找到合适的与之匹配

  对于其余情况,我们均可以通过就近原则将'?'改变,使其满足条件

核心代码:

while(t--) {
        string s;    cin >> s;
        if(s[0] == ')' || s[s.size() - 1] == '(' || s.size() % 2 == 1) cout << "No" << endl;
        else cout << "Yes" << endl;
    }

B题:https://codeforces.com/contest/1469/problem/B

题意:给出两个数字序列A,B,将A,B穿插在一起构成新的序列C,并且C的第一个元素是0,注意在构成序列C的过程中不能改变A、B中元素的先后位序,求序列C的最大前缀为多少。

思路:既然求的是C的最大前缀,并且C是由A,B构成的,那么其实相当于是将A的一个前缀与B的一个前缀穿插起来构成了C,那么C的最大前缀一定是A的最大前缀和加上B的最大前缀和,所以我们只需要预处理一下A,B的前缀和,然后取最大值相加即可。

核心代码:

ll ans1 = 0, ans2 = 0, c = 0, d = 0;//c、d分别用来记录A,B当前的前缀和
cin >> n;
for(int i = 1; i <= n; i++) {
  cin >> a; c += a;
  ans1 = max(c, ans1);
}
cin >> m;
for(int i = 1; i <= m; i++) {
  cin >> b; d += b;
  ans2 = max(d, ans2);
}
cout << ans1 + ans2 << endl;

 

posted @ 2020-12-30 19:15  ACM-Epoch  阅读(68)  评论(0编辑  收藏  举报