首页 > 其他 > 详细

Educational Round 101 (Rated for Div. 2)

时间:2020-12-30 22:21:06      阅读:45      评论:0      收藏:0      [点我收藏+]

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;

 

Educational Round 101 (Rated for Div. 2)

原文:https://www.cnblogs.com/ACM-Epoch/p/14213082.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!