Educational Codeforces Round 101 (Rated for Div. 2)A B C D 题解

题意:一串字符串中只含有‘(’ ')' '?' 其中?可以转化为前两者中的任意一个,问所给字符串是否合法
思路:从前遍历一遍,判断是否有不合法的‘)’ ;从后遍历一遍 判断是否有不合法的‘(’ 即可
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define rep(i,n) for(i=1;i<=n;++i) #define ms(a,n) memset(a,n,sizeof(a)) #define maxn 100005+5 #define inf 0x3f3f33f3f using namespace std; typedef long long ll; ll t, n, i, temp, m, a, b; string s; int main() { int x, y; cin >> t; while (t--) { a = 0, b = 0; temp = 0; bool falg = true; cin >> s; int len = s.length(); if (len & 1)cout << "NO" << endl; else { for (i = 0; i < len; ++i) { if (s[i] == '(')a++; else if (s[i] == ')')b++; else temp++; if (b > temp + a) { falg = false; break; } } int c = 0, d = 0, e = 0; for (i = len - 1; i > 0; --i) { if (s[i] == ')')c++; else if (s[i] == '(')d++; else e++; if (d > e + c) { falg = false; break; } } if (falg)cout << "YES" << endl; else cout << "NO" << endl; } } return 0; }

题意&思路:输出R B 数组的的最大前缀和之和,如果小于0,则输出0
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define rep(i,n) for(i=1;i<=n;++i) #define ms(a,n) memset(a,n,sizeof(a)) #define maxn 100005+5 #define inf 0x3f3f33f3f using namespace std; typedef long long ll; ll t, n, i, temp, m, a, b, maxr, maxb; ll r[106], l[107]; int main() { int x, y; cin >> t; while (t--) { cin >> n; temp = 0; maxr = 0, maxb = 0; for (i = 1; i <= n; ++i) { cin >> r[i]; temp += r[i]; maxr = max(maxr, temp); } temp =0; cin >> m; for(i = 1; i <= m;++i) { cin >> l[i]; temp += l[i]; maxb = max(maxb, temp); } cout << maxb + maxr << endl; } return 0; }


待补

题意:在长度为N的数组A={1,2,3 ......N};每一次操作可以选取下标X ,Y;使A[X]=A[X]/A[Y](向上取整)。问在N+5次操作以内使得A中只有一个二及N-1和1该如何选取下标(输出先X后Y)
思路:对于小于N的数,我们可以使其除于N,使其等于,直至最后只剩下二和N,此时N可以不断处于2,使得N成为1,不过,N最大有2E5,显然这样的操作会超过N+5次,所以我们可以考虑选取一个其他的整数K,使得N除于K的次数加上K除于2的次数小于9。
9的来历:A 中的1和2无需操作,加上K与N的次数,故为5+4=9;
即log2 K+logK N<=9 可以算出K=12到15的时候是成立的,这里以K=12 来coding
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #define rep(i,n) for(i=1;i<=n;++i) #define ms(a,n) memset(a,n,sizeof(a)) #define maxn 100005+5 #define inf 0x3f3f33f3f using namespace std; typedef long long ll; ll t, n, i, temp, m, a, b, maxr, maxb; ll r[106], l[107]; int main() { int sz[35], cnt[10]; rep(i, 30)sz[i] = pow(2, i); rep(i, 7)cnt[i] = pow(12, i); cin >> t; while (t--) { int ans = 0; cin >> n; if (n <= 12) { rep(i, 30) if (sz[i] >= n) { ans += i; break; } cout << ans + n - 3 << endl; for (i = 3; i < n; i++) cout << i << " " << n << endl; temp = n; while (1) { cout << n << " " << 2 << endl; if (temp & 1)temp = temp / 2 + 1; else temp /= 2; if (temp == 1)break; } } else { rep(i, 7) { if (cnt[i] >= n) { ans += i; break; } } cout << ans + n << endl; for (i = 13; i < n; ++i)cout << i << " " << n << endl; temp = n; while (1) { cout << n << " " << 12 << endl; if (temp % 12)temp = temp / 12 + 1; else temp /= 12; if (temp == 1)break; } for (i = 3; i < 12; i++) cout << i << " " << 12 << endl; rep(i,4)cout << 12 << " " << 2 << endl; } } return 0; }

浙公网安备 33010602011771号