哈尔滨华德学院-新生编程挑战赛
哈尔滨华德学院-新生编程挑战赛
A-签到_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
签到
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; map<int,int> mp; for(int i = 0;i < n;i ++){ int x; cin >> x; if(mp.count(x)) continue; cout << x << ' '; mp[x] ++; } return 0; }
B-百分之x的信心_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); double n; cin >> n; double ans = round(n * 100.0); int x = ans; ans = x; cout << ans << '%'; return 0; }
C-幻方_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); i64 n; cin >> n; i64 x = (n * n + 1) / 2; cout << x * n << ' ' << x << '\n'; return 0; }
D-不是幻方_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
行和列逆着输入,就能用\(sort\)对每一列排序,输出也是行列交换输出
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); i64 n; cin >> n; vector g(n,vector<int>(n)); for(int i = 0;i < n;i ++) for(int j = 0;j < n;j ++) cin >> g[j][i]; for(auto &i : g){ sort(i.begin(),i.end()); } for(int i = 0;i < n;i ++) for(int j = 0;j < n;j ++) cout << g[j][i] << " \n"[j == n - 1]; return 0; }
E-要长脑子辣!!!_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
\[\begin{aligned}
x &= \frac{\sum_{i=0}^n(a_i\cdot b_j)}{(\sum_{i=0}^na_i)^x+(\sum_{i=0}^n b_i)^y}
\end{aligned}
\]
数据范围是\(1\leq n,a_i,b_i\le 100,1\le x,y\le10\)
如果直接暴力的话可能会产生\(1e40\)的的大数字,而这在\(C++\)中甚至\(int128\)也不行,不知道python
假如用\(a\)表示\(\sum_{i=0}^na_i\),用\(b\)表示\(\sum_{i=0}^nb_i\),用\(c\)表示\(\sum_{i=0}^n(a_i\cdot b_i)\),则可以简化成:
\[\begin{aligned}
x&=\frac{c}{a^x+b^y}\\
&=\frac{1}{\frac{a^x+b^y}{c}}\\
&=\frac{1}{\frac{a^x}{c}+\frac{b^y}{c}}
\end{aligned}
\]
这个时候\(a,b\)还是可能超出范围,那我们可以将\(a,b,c\)进行质因数分解,即:
\[\begin{aligned}
a &= p_0^{a_1}\cdot p_1^{a_2}\cdot p_2^{a_3}\dots\\
b &= p_0^{b_1}\cdot p_1^{b_2}\cdot p_2^{b_3}\dots\\
c &= p_0^{c_1}\cdot p_1^{c_2}\cdot p_2^{c_3}\dots
\end{aligned}
\]
其中\(p_i\)表示质因子,\(a_i/b_i/c_i\)代表次方,然后就是用质因子的次方去进行一个约分,,最后把约分完的因子乘起来就是约分后的值了,假设\(\frac{a^x}{c}\)约分后为\(\frac{xa}{xc}\),\(\frac{b^y}{c}\)约分后为\(\frac{xb}{cc}\),
则有:
\[\begin{aligned}
x&=\frac{1}{\frac{xa}{xc}+\frac{xb}{cc}}\\
&=\frac{xc\cdot cc}{xa\cdot cc + xb\cdot xc}
\end{aligned}
\]
这个时候分子分母都不会超过\(longlong\)范围,可以直接用\(gcd\)函数约分了.
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; long long ksm(long long a, long long b) { long long res = 1; while (b) { if (b & 1)res = res * a; b >>= 1; a = a * a; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); i64 n, x, y; cin >> n >> x >> y; i64 a = 0, b = 0, c = 0; vector<int> sa(n), sb(n); for (int i = 0, x; i < n; i ++) { cin >> x; sa[i] = x; a += x; } for (int i = 0, x; i < n; i ++) { cin >> x; sb[i] = x; b += x; c += sa[i] * sb[i]; } vector<PII> A, B, C; for (int i = 2; i <= a / i; i ++) { if (a % i == 0) { i64 res = 0; while (a % i == 0) a /= i, res ++; A.emplace_back(i, res * x); } } if (a > 1) A.emplace_back(a, x); for (int i = 2; i <= b / i; i ++) { if (b % i == 0) { i64 res = 0; while (b % i == 0) b /= i, res ++; B.emplace_back(i, res * y); } } if (b > 1) B.emplace_back(b, y); for (int i = 2; i <= c / i; i ++) { if (c % i == 0) { i64 res = 0; while (c % i == 0) c /= i, res ++; C.emplace_back(i, res); } } if (c > 1) C.emplace_back(c, 1); i64 xa = 1, xc = 1; auto CC = C; int i = 0, j = 0; for (; i < A.size() && j < C.size();) { if (A[i].first == C[j].first) { i64 k = A[i].second; A[i].second = max(0ll, k - C[j].second); C[j].second = max(0ll, C[j].second - k); xa *= ksm(A[i].first, A[i].second), i ++; xc *= ksm(C[j].first, C[j].second), j ++; } else if (A[i].first < C[j].first) { xa *= ksm(A[i].first, A[i].second), i ++; } else xc *= ksm(C[j].first, C[j].second), j ++; } while (i < A.size()) { xa *= ksm(A[i].first, A[i].second), i ++; } while (j < C.size()) { xc *= ksm(C[j].first, C[j].second), j ++; } i64 xb = 1, cc = 1; for (i = 0, j = 0; i < B.size() && j < CC.size();) { if (B[i].first == CC[j].first) { i64 k = B[i].second; B[i].second = max(0ll, k - CC[j].second); CC[j].second = max(0ll, CC[j].second - k); xb *= ksm(B[i].first, B[i].second), i ++; cc *= ksm(CC[j].first, CC[j].second), j ++; } else if (A[i].first < C[j].first) { xb *= ksm(B[i].first, B[i].second), i ++; } else cc *= ksm(CC[j].first, CC[j].second), j ++; } while (i < B.size()) { xb *= ksm(B[i].first, B[i].second), i ++; } while (j < CC.size()) { cc *= ksm(CC[j].first, CC[j].second), j ++; } i64 fenzi = xc * cc, fenmu = xa * cc + xb * xc; i64 g = gcd(fenzi, fenmu); fenzi /= g, fenmu /= g; if (fenmu == 1) cout << fenzi << '\n'; else cout << fenzi << '/' << fenmu << '\n'; return 0; }
F-Huadeyyds_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
数据小,直接暴力
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string s , tar = "Huade"; cin >> s; i64 ans = 0; string res = ""; for (int i = 0; i < s.size(); i ++) { if (s.substr(i, 5) == tar) { ans ++ ; res += "Huadeyyds"; i += 4; } else res += s[i]; } if (ans) cout << ans << '\n' << res << '\n'; else cout << '0'; return 0; }
G题赛时放错题了来着
H-神奇"?"_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
暴力
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); string s,st; cin >> s >> st; int ans = 0; for(int i = 0;i < s.size();i ++){ string res = s.substr(i,st.size()); int l = 0, r = 0; while(l < res.size() && (res[l] == st[r] || res[l] == '?')){ l ++, r ++; } if(l == st.size()) ans ++; } cout << ans << '\n'; return 0; }
I-Crazy 小飞象!_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
\(bfs\)
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, x, y; cin >> n >> m >> x >> y; int u[] = {2,2,-2,-2} ,v[] = {2,-2,2,-2}; vector g(n + 1,vector<int>(m + 1,-1)); g[x][y] = 0; queue<PII> Q; Q.push({x,y}); vector<bitset<410>> vis(410); vis[x][y] = 1; while(Q.size()){ auto [dx,dy] = Q.front(); Q.pop(); for(int i = 0;i < 4;i ++){ int xd = dx + u[i]; int yd = dy + v[i]; if(xd > 0 && xd <= n && yd > 0 && yd <= m && !vis[xd][yd]){ g[xd][yd] = g[dx][dy] + 1; vis[xd][yd] = 1; Q.push({xd,yd}); } } } for(int i = 1;i <= n;i ++) for(int j = 1;j <= m;j ++) cout << g[i][j] << " \n"[j == m]; return 0; }
J-幸存者_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
约瑟夫问题变种,就是把第\(k+1\)个循环输出即可
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; queue<int> Q; for (int x, i = 1; i <= n; i ++) { cin >> x; Q.push(x); } Q.push(Q.front()); Q.pop(); int now = 1; while (Q.size() > 1) { if (now % (k + 1) == 0) { cout << Q.front() << ' '; } else Q.push(Q.front()); now ++; Q.pop(); } return 0; }
K-喝“水题”_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); double R, r, H, h; cin >> R >> r >> H >> h; double ans = 2.0 * 3.14 * R * R * R + 3.14 * (H * R * R - h * r * r); printf("%.2lf\n", ans / 3.0); return 0; }
L-小成背单词_哈尔滨华德学院-新生编程挑战赛(同步赛) (nowcoder.com)
线段树板子题
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; #define MAXN 100010 #define INF 0x3fffffff string A[MAXN]; //操作的序列,记得为(1...n)非(0...n) struct node { int left; int right; string max; //维护最大值 } Tree[MAXN << 2]; //存储线段树 void maintain(int root) //向上调整,使得让线段树维护区间最小值最大值区间和 { int LC = root << 1; //此根的左孩子 int RC = (root << 1) + 1; //此根的右孩子 Tree[root].max = max(Tree[LC].max, Tree[RC].max); //根的最大值 } void Build(int root, int start, int end) //构建线段树 { //初始化时传入Build(1,1,n); Tree[root].left = start; //建区间大小 Tree[root].right = end; if (start == end) //当到达叶子节点时 { Tree[root].max = A[start]; return; } int mid = (start + end) >> 1; //中间分开 Build(root << 1, start, mid); //对左孩子建树,左边孩子的编号为root*2 Build((root << 1) + 1, mid + 1, end); //对右边孩子建树 maintain(root); } void update(int root, int pos, string value) //更新点的值 { if (Tree[root].left == Tree[root].right && Tree[root].left == pos) //更新叶子节点的值 { Tree[root].max = value; return; } int mid = (Tree[root].left + Tree[root].right) >> 1; //中间分开成两个区间 if (pos <= mid) //更新的值在左孩子 update(root << 1, pos, value); //更新左孩子 else update((root << 1) + 1, pos, value); //更新的值在右孩子 maintain(root); //叶子节点更新完成后,会回溯到他的父节点,这样一直往上更新到根节点,维护线段树性质 } string RmaxQ(int root, int start, int end) //查询区间最大值 { if (start == Tree[root].left && Tree[root].right == end) { return Tree[root].max; } int mid = (Tree[root].left + Tree[root].right) >> 1; string ret = "114514"; //************可能是 (-INF)要尽可能的小 if (end <= mid) ret = max(ret, RmaxQ(root << 1, start, end)); //完全左孩子区间匹配 else if (start >= mid + 1) ret = max(ret, RmaxQ((root << 1) + 1, start, end)); //完全右孩子区间匹配 else { string a = RmaxQ(root << 1, start, mid); string b = RmaxQ((root << 1) + 1, mid + 1, end); ret = max(a, b); //求的左右两个区间和匹配区间相符的最大值得较大者 } return ret; //记得返回结果 } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; for (int i = 1; i <= n; i ++) cin >> A[i]; Build(1, 1, 1e5 + 1); while (q--) { char op ; int x, y; string s; cin >> op ; if (op == 'Q') { cin >> x >> y; if (RmaxQ(1, x, y) == "114514") cout << "null\n"; else cout << RmaxQ(1, x, y) << '\n'; } else { cin >> x >> s; update(1, x, s); } } return 0; }
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/17873402.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步