“华为杯” 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;
后面的题解无法从此处打开喵~
求个点赞收藏喵~

京公网安备 11010502036488号