Educational Codeforces Round 26

Educational Codeforces Round 26

https://codeforces.com/contest/837

D 差一点,补了E

A. Text Volume

#include <bits/stdc++.h>

using namespace std;

int main () {
    int n;
    string s;
    cin >> n;
    getchar ();
    getline (cin, s);
    int ans = 0, len = 0;
    for (int i = 0; i < s.size (); i++) {
        if (s[i] == ' ')    ans = max (ans, len), len = 0;
        else if (s[i] >= 'A' && s[i] <= 'Z')    len++;
    }
    ans = max (ans, len);
    cout << ans;
}

B. Flag of Berland

#include <bits/stdc++.h>

using namespace std;
const int N = 105;
char a[N][N], idx[] = {'R', 'B', 'G'};
int n, m;

bool check (int model) {
    map<char, vector<int>> mp;
    if (model) { //横
        for (int i = 1; i <= n; i++) {
            for (int j = 2; j <= m; j++) {
                if (a[i][j] != a[i][j-1])   return false;
            }
            mp[a[i][1]].push_back (i);
        }
    }
    else {
        for (int j = 1; j <= m; j++) {
            for (int i = 2; i <= n; i++) {
                if (a[i][j] != a[i-1][j])   return false;
            }
            mp[a[1][j]].push_back (j);
        }        
    }
    set<int> s;
    for (int i = 0; i < 3; i++)     s.insert (mp[idx[i]].size ());
    if (s.size () != 1)     return false;
    //检查是否连续
    int nn = *s.begin ();
    for (int i = 0; i < 3; i++) {
        for (int j = 1; j < nn; j++) {
            if (mp[idx[i]][j] - mp[idx[i]][j-1] != 1)   return false;
        }
    }
    return true;
}

int main () {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
        }
    }
    if (check (0) || check (1))    cout << "YES\n";
    else    cout << "NO\n";
}

C. Two Seals

#include <bits/stdc++.h>

using namespace std;
const int N = 105;
int x[N], y[N], a, b, n, ans;

int main () {
    cin >> n >> a >> b;
    for (int i = 1; i <= n; i++)   cin >> x[i] >> y[i];
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            //if (x[i] > a || x[j] > a || y[i] > b || y[j] > b)   break;
            int s = x[i] * y[i] + x[j] * y[j];
            if (x[i] + x[j] <= a && max (y[i], y[j]) <= b)  ans = max (ans, s);
            if (x[i] + x[j] <= b && max (y[i], y[j]) <= a)  ans = max (ans, s);
            if (y[i] + y[j] <= a && max (x[i], x[j]) <= b)  ans = max (ans, s);
            if (y[i] + y[j] <= b && max (x[i], x[j]) <= a)  ans = max (ans, s);
            if (x[i] + y[j] <= a && max (y[i], x[j]) <= b)  ans = max (ans, s);
            if (x[i] + y[j] <= b && max (y[i], x[j]) <= a)  ans = max (ans, s);
            if (y[i] + x[j] <= a && max (x[i], y[j]) <= b)  ans = max (ans, s);
            if (y[i] + x[j] <= b && max (x[i], y[j]) <= a)  ans = max (ans, s);
        }
    }
    cout << ans << endl;
}

//n^2暴力选即可

D. Round Subset

线性dp小题。把一个维度塞进数组,另一个作为值

// LUOGU_RID: 103242598
#include <bits/stdc++.h>
#define ll long long
#define vi vector<ll>

using namespace std;
const int N = 205, M = 30 * N;
ll cnt2[N], cnt5[N];
int n, k;
ll f[N][M][2]; //f[j][k]: 选了j个数,其中有k个5时, 2的数量

int main () {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        ll x;
        cin >> x;
        while (x % 2 == 0)   x /= 2, cnt2[i] ++;
        while (x % 5 == 0)   x /= 5, cnt5[i] ++;
        //cout << cnt2[i] << ' ' << cnt5[i] << endl;
    }
    //cout << log (1e18) / log (5) << ' ' << log (1e18) / log(2) << endl;
    memset (f, -1, sizeof f);
    f[0][0][0] = f[0][0][1] = 0;
    for (int i = 1; i <= n; i++) {
        int t = (i & 1);
        for (int j = 0; j <= min(k, i); j++) {
            for (int k = 0; k < j * 30; k++) {
                if (!j || k < cnt5[i] || f[j-1][k-cnt5[i]][t] == -1)   continue;
                f[j][k][t^1] = max (f[j][k][t^1], f[j-1][k-cnt5[i]][t] + cnt2[i]);
            }
        }
        //f.swap (tmp);
        for (int j = 0; j <= min(k, i); j++) {
            for (int k = 0; k < j * 30; k++) {
                f[j][k][t] = f[j][k][t^1];
            }
        }
    }
    ll ans = 0;
    for (ll i = 0; i < 30 * n; i++) { //cnt5
        //cout << i << ' ' << f[n][k][i] << endl;
        ans = max (ans, min (i, f[k][i][n&1]));
    }
    cout << ans << endl;
}

//min(cnt2, cnt5)

E. Vasya's Function

#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef pair<int, int> pii; //因子,次数
vector <pii> v;

signed main () {
    int x, y, ans = 0;
    cin >> x >> y;
    int a = x;
    //v.push_back ({0, 0});
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            v.push_back ({i, 0});
            while (x % i == 0)  x /= i, v.back ().second ++;
        }
    }
    if (x)  v.push_back ({x, 1});
    //for (auto i : v)    cout << i.first << ' ' << i.second << endl;
    
    x = a;
    while (1) {
        int maxn = 0, id = 0;
        for (int i = 0; i < v.size (); i++) {
            auto &p = v[i].first, &cnt = v[i].second;
            if (!cnt)   continue; //key!!!因为多次迭代会使得因子被用完
            int tt = y / p * p; //<y的p的最大倍数
            if (tt > maxn)  maxn = tt, id = i; //记录最大倍数
        }

        auto &p = v[id].first, &cnt = v[id].second;
        //cout << y << ' ' << maxn << endl;
        ans += y - maxn, y = maxn;
        if (y == 0) break;
        cnt--, x /= p, y /= p;
    }
    cout << ans << endl;
}

//因子,数量

F. Prefix Sums

G. Functions On The Segments

posted @ 2023-02-28 19:21  Sakana~  阅读(24)  评论(0编辑  收藏  举报