• 2020 年百度之星·程序设计大赛


    海星, 比上次强, 下场初赛就不打了, 主要上次读题太ex, 这次读题海星

    A

    氵题, 顶多是取整问题有人可能会wa一下(没错, 就是我)

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IO ios::sync_with_stdio(0); cin.tie(0);
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
    
    const int N = 1e5 + 5;
    
    int n, m, _, k;
    
    int main() {
        IO;
        for (cin >> _; _; --_) {
            cin >> n >> m >> k;
            int p = m * (100 - k) / 100;
            int c = 0;
    
            if (p == 0) c = n / m;
            else {
                while (n >= m) {
                    int cur = n / m;
                    c += cur;
                    n = n % m + cur * p;
                }
            }
    
            cout << c << '
    ';
        }
        return 0;
    }
    

    B

    排序之后, 统一沿着一条直线放就是最优

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IO ios::sync_with_stdio(0); cin.tie(0);
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
    
    const int N = 1e5 + 5;
    
    int n, m, _, k;
    int a[N];
    
    int main() {
        IO;
        for (cin >> _; _; --_) {
            cin >> n;
    
            rep (i, 1, n) cin >> a[i];
            sort(a + 1, a + 1 + n);
    
            ll ans = 0;
            rep (i, 2, n) {
                ans += (ll)(a[i] - a[i - 1]) * (n - i + 1) * (i - 1);
            }
    
            cout << ans << '
    ';
        }
        return 0;
    }
    

    C

    排完序, 模拟就行

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IO ios::sync_with_stdio(0); cin.tie(0);
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<int, PII> PIII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
    
    const int N = 2e5 + 5;
    
    int n, m, _, k;
    bool v[20005];
    pair<int, PII> s[N];
    
    int main() {
        IO;
        for (cin >> _; _; --_) {
            cin >> n;
            memset(v, 0, sizeof v);
            v[1] = 1;
            int cnt = 0;
    
            rep (i, 1, n) {
                cin >> m;
    
                rep (j, 1, m) 
                    s[++cnt].se.se = i, cin >> s[cnt].fi >> s[cnt].se.fi;
            }
    
            sort(s + 1, s + 1 + cnt);
    
            rep (i, 1, cnt) {
                VI cur; cur.pb(s[i].se.se);
                bool f = v[cur.back()];
    
                while (i < cnt) {
                    if (s[i + 1].fi != s[i].fi || s[i + 1].se.fi != s[i].se.fi) break;
                    cur.pb(s[++i].se.se);
                    if (f) continue;
                    f = v[cur.back()];
                }
    
                if (f) for (int j : cur) v[j] = 1;
            }
    
            cout << 1;
            rep (i, 2, n) if (v[i]) cout << ' ' << i;
            cout << endl;
        }
        return 0;
    }
    

    D

    md又是语文题, 原来车牌重复不是相同得车阿, 亏我还set去重了, wa了半天, 还以为自己写错了

    就那么点范围, 直接暴搜

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IO ios::sync_with_stdio(0); cin.tie(0);
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<int, PII> PIII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
    
    const int N = 2e5 + 5;
    
    int n, m, _, k;
    int a[10], b[5];
    
    void dfs(int d) {
        if (d > 9) { 
            int c = b[0];
            rep (i, 1, 4) c = max(c, b[i]);
            m = min(m, c);
            return;
        }
    
        rep (i, 0, 4) {
            b[i] -= a[d];
            dfs(d + 1);
            b[i] += a[d];
        }
    }
    
    int main() {
        IO;
        for (cin >> _; _; --_) {
            cin >> n;
            memset(a, 0, sizeof a);
    
            rep (i, 1, n) {
                string s; cin >> s;
                ++a[s.back() - '0'];
            }
    
            sort(a, a + 10); m = n;
            rep (i, 0, 4) b[i] = m; 
    
            dfs(0);
            cout << m << '
    ';
        }
        return 0;
    }
    

    E

    模拟, 对于能现给最喜欢的且能满足所有最喜欢这种饮料得人数, 就先分配

    试想: x最喜欢a, 且得到了a, 如果存在用其他饮料跟x换, 使得得分变高, 则x得到了次喜欢得饮料, y得到了a(从喜欢(1)到最喜欢(3)),

    还记得前提吗, 我们已经满足了所有最喜欢a得人了, 所以不存在 y, 故能直接满足得,直接先, 剔除这部分人和饮料

    那剩下的不就简单了吗? 要么是 两种最喜欢饮料的人群被清除, 或一种最喜欢饮料的人被清除

    直接去填补就行了, 模拟一下, 具体细节见代码, 我写的 if else 应该很清晰

    #include <bits/stdc++.h>
    #define all(n) (n).begin(), (n).end()
    #define se second
    #define fi first
    #define pb push_back
    #define mp make_pair
    #define sqr(n) (n)*(n)
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define per(i,a,b) for(int i=(a);i>=(b);--i)
    #define IO ios::sync_with_stdio(0); cin.tie(0);
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> PII;
    typedef pair<int, PII> PIII;
    typedef pair<ll, ll> PLL;
    typedef vector<int> VI;
    typedef double db;
    
    const int N = 1e5 + 5;
    
    int n, m, _, k;
    int a, b, c, d[3][2];
    bool v[3];
    char s[5];
    
    void clear(int id, int& a) {
        m += (d[id][0] + d[id][1]) * 3;
        a -= (d[id][0] + d[id][1]);
        d[id][0] = d[id][1] = 0;
        v[id] = 0;
    }
    
    void work1(int a, int b, int c, int x, int y) {
        if (a >= x) m += (x << 1) + (a - x);
        else m += (a << 1);
    
        if (b >= y) m += (y << 1) + (b - y);
        else m += (b << 1);
    
        m += c * 3;
    }
    
    void work2(int b, int x, int y) {
        if (b >= y) m += b * 3 + (x + y - b) * 2;
        else m += b * 3 + (y - b) + (x << 1);
    }
    
    int main() {
        IO;
        for (cin >> _; _; --_) {
            cin >> n >> a >> b >> c;
            v[0] = v[1] = v[2] = 1;
            memset(d, 0, sizeof d);
    
            rep(i, 1, n) {
                cin >> s;
    
                if (s[0] == '0') {
                    if (s[1] == '1') ++d[0][0];
                    else ++d[0][1];
                }
                else if (s[0] == '1') {
                    if (s[1] == '0') ++d[1][0];
                    else ++d[1][1];
                }
                else {
                    if (s[1] == '0') ++d[2][0];
                    else ++d[2][1];
                }
            }
    
            m = 0;
            if (a >= d[0][0] + d[0][1]) clear(0, a);
            if (b >= d[1][0] + d[1][1]) clear(1, b);
            if (c >= d[2][0] + d[2][1]) clear(2, c);
    
            if (!v[0] && !v[1] && !v[2]);
            else if (!v[0] && !v[1]) work1(a, b, c, d[2][0], d[2][1]);
            else if (!v[0] && !v[2]) work1(a, c, b, d[1][0], d[1][1]);
            else if (!v[1] && !v[2]) work1(b, c, a, d[0][0], d[0][1]);
            else if (!v[0]) work2(b, d[1][0], d[1][1]), work2(c, d[2][0], d[2][1]);
            else if (!v[1]) work2(a, d[0][0], d[0][1]), work2(c, d[2][1], d[2][0]);
            else work2(a, d[0][1], d[0][0]), work2(b, d[1][1], d[1][0]);
    
            cout << m << '
    ';
        }
        return 0;
    }
    

    F

    写了半天, 不会阿, 哭唧唧

  • 相关阅读:
    webService 部署以后参数输入框不能显示
    c# 发送邮件功能
    Linux上的free命令详解
    curl 命令详解
    查看mysql的root密码
    [shell]find用法小结
    ArrayList Vector LinkedList 区别与用法
    SecureCRT编码转换vim
    HashMap和Hashtable的区别
    Java中ArrayList和 LinkedList区别
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/13377440.html
Copyright © 2020-2023  润新知