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;
}

 

posted @ 2021-03-17 19:02  DONDONDA  阅读(52)  评论(0)    收藏  举报