寒假训练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;