“华为杯” 2024年广东工业大学新生赛(同步赛)

A-演奏春日影

签到题--字符串判断+输入输出

如果是“Tomori”就需要再后面多输出一个“Haruhikage”

其他的就是来什么输出什么

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
const int N = 1e5 + 7;

void slu() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        cout<<s<<endl;
        if (s == "Tomori") {
            cout<<"Haruhikage"<<endl;
        }
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}



N-哥伦比亚大选:

签到题--结构体

直接干就完了

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<string,int>
const int N = 1e5 + 7;

bool cmp(PII a, PII b) {
    return a.second > b.second;
}

void slu() {
    int n;
    cin >> n;
    map<string, int> m;
    for (int i = 0; i < n; i++) {
        string s;
        int x;
        cin >> s >> x;
        m[s] = x;
    }
    vector<PII > a(m.begin(), m.end());
    std::sort(a.begin(), a.end(), cmp);
    cout << a[0].first;

}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}



I-小 P 爱折跃:

并查集

每当找到两个不联通的集合就需要res++

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>

void slu() {
    int n;
    cin >> n;
    int cnt = 0;
    int res = -1;
    vector<int> a(n + 1);
    vector<int> mem(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        int loc = a[i];
        if (!mem[loc])res++;
        while (!mem[loc]) {
            mem[loc] = 1;
            loc = a[loc];
        }
    }
    cout << res << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
//    T = 1;
    while (T--)slu();

}



E-黑塔的奇物:

(免责声明:我这题是一眼丁真的,但是题目一定是有规律的)

根据提示特别声明是奇数,而且样例给的都是123,231,312这种排序

不难猜出

构造的序列是每一行每一列都是1-n这样

那就转化成一个简单的输出问题了

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>

void slu() {
    int n;
    cin >> n;
    int res = 0;
    for (int i = 1; i <= n; i++) {
        res ^= i;
    }
    cout << res << endl;
    for (int j = 0; j < n; j++) {
        for (int i = 1; i <= n; i++) {
            int k = i + j;
            while (k >= n + 1)k -= n;
            cout << k << " ";
        }
        cout << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}


F-字符串缩写太多了!:

由于给定 n 个都是不同的符串,所以我们只需要记住输入了几个就行了,每一个都是不同的就根本不需要考虑其具体是什么形式

就简单很多

n个字母任选i(i>0&&i<=n)个求排列组合

也就是

选一个,选两个,选三个...选n个

C(n,1)*A(1,1)+C(n,2)*A(2,2)+...C(n,n)*A(n,n)

把C和A拆开算一下,发现都能消掉C的分母

最后变成A(n,1)+A(n,2)+A(n,3)+...+A(n,n)

求和即可(记得要求模)
#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>

int MOD = 1e9 + 7;

void slu() {
    int n;
    cin >> n;
    int res = 0;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
    }
    int k = 1;
    for (int i = n; i >= 1; i--) {
        k *= i;
        k %= MOD;
        res += k;
        res %= MOD;
    }
    cout << res << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}



C-交通要塞:

换个方向来看世界会更好:

与其让那么多的车都向左前进1格,不如让自己每秒后退一格喵

然后就是贪心往前走就行了,因为前面有且只有一个空隙的空着的

错过就没有了

如果到了要撞到右边的车的时候还不能往前走,那就输出-1

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>

void slu() {
    int n;
    cin >> n;
    int res = 1;
    int cur = 0;
    vector<PII > a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i].first >> a[i].second;
    }
    for (int i = 1; i <= n; i++) {
        if (a[i].first > cur) {
            int dis = a[i].first - cur;
            if (i != 1 && dis - 1 > a[i - 1].second - cur) {
                cout << -1 << endl;
                return;
            }
            res += a[i].first - cur;
            cur = a[i].first;
        } else if (a[i].second > cur) {
            cur++;
            res+=1;
        } else {
            cout << -1 << endl;
            return;
        }
    }
    cout << res << endl;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
//    cin >> T;
    T = 1;
    while (T--)slu();

}


J-好得不能再好了!泰拉投资大师课:

对于要赢n场的比赛概率(获胜概率为W,失败概率为L=1-W)

就是W^n*(1+C(n,1)*L^1+C(n+2,2)*L^2+...+C(n+n-1,n-1)*L^(n-1) )

那么根据题目给的逆元公式b/a≡a⋅b^M−2(mod M),其中 M 是质数。

可以求出W,那么后面的一坨该怎么办呢?

如果暴力的话算C太慢了,会TLE

我们不妨看一下第k项和第k+1项的差距,发现就a[k]=a[k-1]*[L*(n+k)/k]

(具体为什么大家把C打开变成因子形式就一目了然了)

这样对于后面一坨只需要通过递推就可以快速算出来

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
int MOD = 1e9 + 7;
vector<int> mem(1e5 + 5);

int qpow(int a, int b, int m) {
    a %= m;
    int res = 1;
    while (b > 0) {
        if (b & 1) res = res * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}

void slu() {
    int n, p, q;
    cin >> n >> p >> q;
    int temp = qpow(q, MOD - 2, MOD);
    int win = p * temp % MOD;
    int lose = (q - p) * temp % MOD;
    int plus = 0;
    int L = 1;
    int t = 1;
    for (int i = 1; i <= n; i++) {
        plus = (plus + (t * L) % MOD) % MOD;
        t = (t * (n + i - 1) % MOD * mem[i]) % MOD;
        L = (L * lose) % MOD;
    }
    cout << qpow(win, n, MOD) * plus % MOD << endl;
}

signed main() {

    for (int i = 1; i < 1e5 + 7; i++) mem[i] = qpow(i, MOD - 2, MOD);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
//    T = 1;
    while (T--)slu();

}


K-说重话!!:

数学题:

设第i天的奋斗时间为C[i]

那么对于第i天以前的方案一产生的时间为A[i]

方案二产生的时间为B[i]

C[i]=A[i]+B[i]

A[i]很明显是个等差数列,因为每次都比前一天多1-->初始化为A[i]=D*i+K,D=0,K=0;

那么每当遍历到该天的时候需要修改A的公式,那么该如何修改呢?

对于第k天的产生的方案一的影响,不算其他天产生的影响,那么就是

A1[i]=i+(k-1)

那么修改方式就是A+A1-->D++,K+=(k-1);

同理对于方案二是个二次函数

B[i]=A*i^2-B*i+C;

修改方式就是:

A++

B+=2*k;

C+=k^2;

#include "bits/stdc++.h"

using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
#define TI tuple<int, int, int>
const int MOD = 1e9 + 7;
!
void slu() {
    int n, m;
    cin >> n >> m;
    map<int, vector<int>> mp;
    for (int i = 0; i < m; i++) {
        int x, y;
        cin >> x >> y;
        mp[y].push_back(x);
    }
    TI c = {0, 0, 0};
    PII j = {0, 0};
    for (int i = 1; i <= n; i++) {
        if (!mp[i].empty()) {
            for (auto it: mp[i]) {
                if (it == 1) {//j
                    j.first = j.first + 1%MOD;
                    j.second = j.second + i - 1%MOD;
                } else { //c
                    int d = i - 1;
                    get<0>(c) = get<0>(c) + 1%MOD;
                    get<1>(c) = get<1>(c) + 2 * d%MOD;
                    get<2>(c) = get<2>(c) + d * d%MOD;
                }
            }
        }
        int A = get<0>(c)%MOD, B = get<1>(c)%MOD, C = get<2>(c)+MOD%MOD;
        cout << (j.first * i - j.second + A * i * i+ MOD % MOD - B * i + C) % MOD;
        if (i != n)cout << " ";
        if (i == n)cout << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
//    T = 1;
    while (T--)slu();

}


后面的题解无法从此处打开喵~

求个点赞收藏喵~