“华为杯” 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这样
那就转化成一个简单的输出问题了
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
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;
后面的题解无法从此处打开喵~
求个点赞收藏喵~