跳转至

2025华中农业大学第十四届程序设计竞赛

2025-05-07

gym: https://codeforces.com/gym/105838

之前随便打了一下,有的题没有补,之后看到再来。

pEXn79K.png

A

挺简单,就是模拟就行。本来py写,但是一直运行过不了,改C++写也是调了一会才过。主要其实就是东西稍微有点多。

后来看了,我写数组没写下标。。。它没告诉我是这个问题,,,好像是我没安py插件,安了是不是不会这样,还有有时候可以把py用熟练点。

#include<bits/stdc++.h>
using namespace std;

void solve()
{
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> b(m + 1), r(m + 1), x(n + 1), y(n + 1);
    for(int i = 1; i <= m; i++)
        cin >> b[i];
    for(int i = 1; i <= m; i++)
        cin >> r[i];
    vector<vector<int>> p(m + 1, vector<int>(n + 1));
    for(int i = 1; i <= m; i++)
        for(int j = 1; j <= n; j++)
            cin >> p[i][j];
    for(int i = 1; i <= n; i++) cin >> x[i];
    for(int i = 1; i <= n; i++) cin >> y[i];
    vector<int>mx(m + 1);
    for(int i = 1; i <= m; i++)
        mx[i] = *max_element(p[i].begin() + 1, p[i].end());
    int ans = 0;
    for(int i = 1; i <= n; i++){
        int get = min(100, x[i] / 60 + y[i]);
        vector<int> tmp;
        for(int j = 1; j <= m; j++){
            if(p[j][i] == -1)
                tmp.push_back(0);
            else if(p[j][i] == 0)
                tmp.push_back(b[j]);
            else
                tmp.push_back(b[j] + r[j] * p[j][i] / mx[j]);
        }
        sort(tmp.begin(), tmp.end(), greater<int>());
        int practice = 0;
        for(int j = 0; j < k; j++)
            practice += tmp[j];
        if(practice >= 50 * k && get >= 50 && (get >= 60 || practice >= k * 60))
            ans++;
        // cerr << practice << " " << get << '\n';
    }   
    cout << ans << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

哦对了,py定义二维数组不能直接 [[0] * m] * n 这样对单个修改,所有的都会改。需要像 [[0] * m for _ in range(n)]

for _ in range(int(input())):
    n, m, k = map(int, input().split())
    b = list(map(int, input().split()))
    r = list(map(int, input().split()))
    score = [0] * n
    # p = [[]] * m
    p = [[] for i in range(m)]
    for i in range(m):
        p[i] = list(map(int, input().split()))
    x = list(map(int, input().split()))
    y = list(map(int, input().split()))
    # print(x,y);
    # print(p)
    pmax = [0] * m # 每场比赛的最高分
    # get = [[]] * n
    get = [[] for i in range(n)]
    for i in range(m):
        for j in range(n):
            pmax[i] = max(pmax[i], p[i][j])

    for i in range(n):

        for j in range(m):
            if p[j][i] == -1:
                get[i].append(0)
            elif p[j][i] == 0:
                get[i].append(b[j])
            else:
                # print(type(pmax[j]))
                # num = r * (int)(p[j][i]) + pmax[j] - 1
                # print(num)
                # print((b[j] + (r[j] * p[j][i]) // pmax[j]))
                get[i].append(b[j] + (r[j] * p[j][i]) // pmax[j])
        # print(i,get[i])
    # print(get)
    ans = 0
    for i in range(n):
        # print(get[i])
        get[i].sort(reverse = True)
        # print(x[i], y[i], "xy")
        A = x[i] // 60 + y[i]
        B = 0
        for j in range(k):
            B += get[i][j]
        # print(A, B, "AB")
        if A >= 50 and B >= 50 * k and (A >= 60 or B >= 60 * k):
            ans += 1
    print(ans)

B

签到

a = list(map(int, input().split()))
a.sort()
if a[1] > a[0] and a[2] > a[0]:
    # a[1] > a[0] , a[0] < a[2]
    print(a[1],a[0],a[2])
else:
    print(-1)

C

挺简单,要使得 \(\frac{1}{x} + \frac{1}{y}\) 最小,且 \(x + y\) 的值固定,那么显然 \(xy\) 越大越好,就是 \(x\)\(y\) 的值越接近越好,那么二分找一下就行。

那我为什么 WA 很多次呢?快速幂传参数,忘记给 \(a\) 取模了,这个很重要,以后注意。

/*
1/x + 1/y
(x+y)/xy
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
using ll = long long;

constexpr int mod = ll(1e9) + 7;

ll ksm(ll a, ll b)
{
    ll res = 1;
    a %= mod;
    while(b){
        if(b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1; 
    }
    return res;
}
ll inv(ll a){return ksm(a, mod - 2);}
void solve()
{
    // for(int x = 1; x <= 99; x++)
    //     cout << 1.0/x + 1.0/(100-x) << '\n';
    int n, q;
    cin >> n >> q;
    vector<int>a(n + 1), pre(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i];
    }
    while(q--){
        int L, R;
        cin >> L >> R;
        int mid = (pre[R] - pre[L - 1] + 1)/2 + pre[L - 1];
        auto it = lower_bound(pre.begin() + L, pre.begin() + R, mid);
        // cerr << it - pre.begin() << '\n';
        // if(it == pre.begin() + R){
        //     cout << (inv(a[R]) + inv(pre[R - 1] - pre[L - 1])) % mod << ' ';
        //     continue; 
        // }
        // if(it == pre.begin() + L){
        //     cout << (inv(a[L]) + inv(pre[R] - pre[L])) % mod << ' ';
        //     continue;
        // }
        int idx = it - pre.begin();
        ll X = 0;
        for(int j = max(L, idx - 1); j <= min(idx + 1, R - 1); j++){
            X = max(X, 1LL * (pre[j] - pre[L - 1]) * (pre[R] - pre[j]));
        }
        cout << 1LL * (pre[R] - pre[L - 1]) * inv(X) % mod << ' ';
    }
    cout << '\n';
}

signed main()
{
    // freopen("1.err", "w", stderr);
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T = 1;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

D

签到

#include<bits/stdc++.h>
using namespace std;

void solve()
{
    int n;
    cin >> n;
    vector<bool>vis(n + 1);
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        vis[x] = true;
    }
    for(int i = 1; i <= n; i++){
        if(!vis[i]){
            cout << i << '\n';
            return;
        }
    }
    cout << "-1\n";
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while(T--)
        solve();
    return 0;
}

H

签到

r = [0] * 100001
c = [0] * 100001
for _ in range(int(input())):
    n = int(input())
    x = list(map(int,input().split()))
    y = list(map(int,input().split()))
    # print(x)
    # print(y)

    ans = 0
    for i in range(n):
        ans += r[x[i]] + c[y[i]]
        r[x[i]] += 1
        c[y[i]] += 1
    print(ans)
    for i in range(n):
        r[x[i]] -= 1
        c[y[i]] -= 1

K

签到

#include<bits/stdc++.h>
using namespace std;

void solve()
{
    string s;
    cin >> s;
    for(int i = 0; i + 1 < s.size(); i++){
        if(s[i] < s[i + 1]){
            swap(s[i], s[i + 1]);
            break;
        }
    }
    cout << s << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while(T--)
        solve();
    return 0;
}