SMU 2024 spring 天梯赛3

7-1 重要的话说三遍 - SMU 2024 spring 天梯赛3 (pintia.cn)

I'm gonna WIN!
I'm gonna WIN!
I'm gonna WIN!

7-2 两小时学完C语言 - SMU 2024 spring 天梯赛3 (pintia.cn)

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n,k,m;
cin >> n >> k >> m;
cout << max(n - k * m,0) << '\n'; return 0;
}

7-3 拯救外星人 - SMU 2024 spring 天梯赛3 (pintia.cn)

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int a,b,ans = 1;
cin >> a >> b;
for(int i = 1;i <= a + b;i ++)
ans *= i;
cout << ans << '\n'; return 0;
}

7-4 谁能进图书馆 - SMU 2024 spring 天梯赛3 (pintia.cn)

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int a, b, c, d;
cin >> a >> b >> c >> d; if (d >= b && c < a) {
printf("%d-Y %d-Y\nqing 2 zhao gu hao 1", c, d);
} else if (c >= b && d < a) {
printf("%d-Y %d-Y\nqing 1 zhao gu hao 2", c, d);
}else if(c >= a && d >= a){
printf("%d-Y %d-Y\nhuan ying ru guan", c, d);
}else if(c < a && d < a){
printf("%d-N %d-N\nzhang da zai lai ba", c, d);
}else if(c >= a){
printf("%d-Y %d-N\n1: huan ying ru guan", c, d);
}else{
printf("%d-N %d-Y\n2: huan ying ru guan", c, d);
} return 0;
}

7-5 试试手气 - SMU 2024 spring 天梯赛3 (pintia.cn)

每个骰子从6往下枚举n个,遇见有过的跳过即可;

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n;
vector<int> a(6);
for (auto &i : a)cin >> i;
cin >> n; for(int i = 0;i < 6;i ++){
for(int j = 6,m = n;j >= 1 && m;j --){
if(j == a[i]) continue;
m--;
if(!m) cout << j << " \n"[i == 5];
}
} return 0;
}

7-6 查验身份证 - SMU 2024 spring 天梯赛3 (pintia.cn)

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n;
cin >> n;
const int w[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
const char M[] = {'1','0','X','9','8','7','6','5','4','3','2'}; vector<string> ans;
while(n --){
string s;
cin >> s;
int num = 0,f = 0;
for(int i = 0;i < 17;i ++){
if(s[i] < '0' || s[i] > '9'){
ans.push_back(s);
f = 1;
break;
}
num += (s[i] - '0') * w[i];
}
if(f) continue;
num %= 11;
if(M[num] != s.back())
ans.push_back(s);
} if(!ans.size()) cout << "All passed\n";
else{
for(auto i : ans)
cout << i << '\n';
}
return 0;
}

7-8 连续因子 - SMU 2024 spring 天梯赛3(补题) (pintia.cn)

按照滑动窗口的思想每次连乘,大于n时除掉前面的数;

维护连续乘的个数,大于ans时更新答案;

数据范围弱,可以直接枚举到n,因其有一个数据点最大因子超过\(\sqrt n\),也可以枚举到\(2 \times \sqrt n\),不过要注意特判素数;

素数判断时也超时,可以改下\(i \times i \leq n\)换成$ i \leq \sqrt n$,可能有奇效;

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); i64 n;
cin >> n; auto ss = [](int x) {
if (x < 2) return false;
if (x == 2) return true;
for (int i = 2; i <= sqrt(x); i ++)
if (x % i == 0) return false;
return true;
}; if (ss(n)) {
cout << 1 << '\n' << n << '\n';
return 0;
} vector<i64> ans;
i64 num = 0, res = 1, head = 2;
for (int i = 2; i <= sqrt(n) * 2; i ++) {
res *= i;
num ++;
if(!ans.size() && n % i == 0){
ans.push_back(i);
}
while (res > n) {
res /= head;
head ++;
num --;
}
if (n % res == 0) {
if (num > ans.size()) {
vector<i64>().swap(ans);
for (int j = head; j <= i; j ++)
ans.push_back(j);
}
}
} cout << ans.size() << '\n';
for (auto i : ans)
cout << i << "*\n"[i == ans.back()]; return 0;
}

7-8 出租 - SMU 2024 spring 天梯赛3 (pintia.cn)

模拟

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); string s;
cin >> s;
vector<int> arr,vis(10),index(12); for(int i = 0;i < 11;i ++){
int num = s[i] - '0';
if(vis[num]) continue;
arr.push_back(num);
vis[num] = 1;
} sort(arr.begin(),arr.end(),greater<>());
for(int i = 0;i < arr.size();i ++){
index[arr[i]] = i;
} cout << "int[] arr = new int[]{";
for(int i = 0;i < arr.size();i ++){
cout << arr[i] ;
if(i != arr.size() - 1) cout << ',';
}
cout << "};\n";
cout << "int[] index = new int[]{";
for(int i = 0;i < 11;i ++){
cout << index[s[i] - '0'] ;
if(i != 10) cout << ',';
}
cout << "};"; return 0;
}

7-9 哈利·波特的考试 - SMU 2024 spring 天梯赛3 (pintia.cn)

Floyd处理出两两最短长度;

枚举每只动物能变成其余动物最长魔咒长度,取最小值;

若没有一只动物能变成其余各种动物,输出0;

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, m;
cin >> n >> m;
typedef pair<i64, i64> PII;
vector dis(n + 1, vector<i64>(n + 1, INT_MAX));
for (int i = 0; i < m; i ++) {
int u, v, w;
cin >> u >> v >> w;
dis[u][v] = w;
dis[v][u] = w;
} for (int k = 1; k <= n; k ++) {
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
if (i == j) dis[i][j] = 0;
if (dis[i][k] + dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
} i64 ans = INT_MAX, f = 0, index = 0;
for (int i = 1; i <= n; i ++) {
i64 res = INT_MIN;
for (int j = 1; j <= n; j ++) {
if (dis[i][j] == INT_MAX) {
res = INT_MIN;
break;
}
res = max(res, dis[i][j]);
}
if (res < ans && res != INT_MIN) {
ans = res, index = i;
}
} if (index) {
cout << index << ' ' << ans << '\n';
} else
cout << 0 << '\n'; return 0;
}

7-10 列车厢调度 - SMU 2024 spring 天梯赛3 (pintia.cn)

按题意模拟;

注意点是,1号车厢没有枚举完时若此时3号车厢满足条件,应该从3号转到2号;

具体例子:

ABCD
CBAD

output:

1->3
1->3
1->2
3->2
3->2
1->2

code:

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); string s1, s2;
cin >> s1 >> s2; stack<char> box;
vector<string> ans;
int index = s1.size() - 1;
reverse(s1.begin(), s1.end());
for (int i = 0; i < s2.size(); i ++) {
if (!box.size() || box.top() != s2[i]) {
while (index >= 0 && s1[index] != s2[i]) {
box.push(s1[index]);
ans.push_back("1->3");
index --;
}
} if (index >= 0 && s1[index] == s2[i]) {
ans.push_back("1->2");
index --;
continue;
}
if (box.size() && box.top() == s2[i]) {
ans.push_back("3->2");
box.pop();
} else {
cout << "Are you kidding me?\n";
return 0;
}
} for (auto i : ans)
cout << i << '\n'; return 0;
}

7-11 文件传输 - SMU 2024 spring 天梯赛3 (pintia.cn)

并查集;

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

struct UFS {
vector<int> fa;
int n;
UFS(int n): n(n) {
fa.resize(n + 1);
for (int i = 0 ; i <= n; i ++)
fa[i] = i;
}
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void unin(int x, int y) {
x = find(x), y = find(y);
if (x != y) fa[x] = y;
}
}; int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n;
cin >> n; UFS ufs(n);
char c;
int c1, c2;
while (cin >> c) {
if (c == 'S') break;
cin >> c1 >> c2;
if (c != 'C') {
ufs.unin(c1, c2);
} else {
c1 = ufs.find(c1);
c2 = ufs.find(c2);
if (c1 != c2) {
cout << "no\n";
} else
cout << "yes\n";
}
} int num = 0;
for (int i = 1; i <= n; i ++)
if (ufs.find(i) == i) num ++;
if(num == 1) cout << "The network is connected.\n";
else cout << "There are " << num << " components.\n"; return 0;
}

7-12 病毒溯源 - SMU 2024 spring 天梯赛3 (pintia.cn)

根节点不一定从0开始,但一定唯一,所以可以先找出根节点;

跑一遍dfs计算出最大深度;

然后对每个点的相连的点做一个排序;

再跑一遍dfs统计答案,当第一次跑到最大深度时即是最小序列;

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n;
cin >> n; vector g(n + 1, vector<int>());
vector<int> fa(n);
iota(fa.begin(),fa.end(),0);
for (int i = 0; i < n; i ++) {
int k;
cin >> k;
if (k) {
for (int j = 0; j < k; j ++) {
int x;
cin >> x;
g[i].push_back(x);
fa[x] = i;
}
}
} int root = 0;
for(int i = 0;i< n;i ++){
if(fa[i] == i) {
root = i;
break;
}
} for (int i = 0; i < n; i ++) {
sort(g[i].begin(), g[i].end());
} int mx = 0;
auto dfs = [&](auto dfs, int u, int now) -> void{
mx = max(now, mx);
for (auto i : g[u]) {
dfs(dfs, i, now + 1);
}
}; dfs(dfs, root, 1);
vector<int> ans;
auto dfs1 = [&](auto dfs, int u, int now) -> void{
if (now == mx) {
cout << mx << '\n';
for (auto i : ans)
cout << i << " \n"[i == ans.back()];
exit(0);
}
for (auto i : g[u]) {
ans.push_back(i);
dfs(dfs, i, now + 1);
ans.pop_back();
}
}; ans.push_back(root);
dfs1(dfs1, root, 1); return 0;
}

7-14 天梯地图 - SMU 2024 spring 天梯赛3(补题) (pintia.cn)

dijkstra进阶做法,包含路径记录,以及按权重统计路径条件等;

不过最开始我一直将优先队列开的最大堆,但是一直过不了自己的例子,后来改成最小堆并且路径值改成负数存进去就对了,再后来我发现改成最大堆也可以,不过要把点值改成负数,最后才焕然大悟,这题路径取最短的同时,节点值也应该尽量的小(

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

struct DIJ {
using i64 = long long;
using PII = pair<i64, i64>;
vector<i64> dis, path, node;
vector<vector<array<int, 3>>> G;
int n; DIJ() {}
DIJ(int n): n(n) {
node.resize(n + 1, 1);
dis.assign(n + 1, 1e18);
G.resize(n + 1);
path.resize(n + 1, -1);
} void add(int u, int v, int w, int val) {
G[u].push_back({v, w, val});
} void dijkstra(int s) {
priority_queue<PII,vector<PII>,greater<PII>> que;
dis[s] = 0;
que.push({0, -s});
while (!que.empty()) {
auto p = que.top();
que.pop();
int u = -p.second;
if (dis[u] < p.first) continue;
for (auto [v, w, val] : G[u]) {
if (dis[v] > dis[u] + w) {
node[v] = node[u] + val;
dis[v] = dis[u] + w;
que.push({ dis[v], -v});
path[v] = u;
} else if (dis[v] == dis[u] + w) {
if (node[v] > node[u] + val) {
node[v] = node[u] + val;
path[v] = u;
}
}
}
}
}
}; int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); int n, m;
cin >> n >> m;
DIJ time(n), way(n);
while (m --) {
int u, v, c, t, w;
cin >> u >> v >> c >> w >> t;
time.add(u, v, t, w);
way.add(u, v, w, 1);
if (!c) {
time.add(v, u, t, w);
way.add(v, u, w, 1);
}
} int st, ed, ok;
cin >> st >> ed;
time.dijkstra(st);
way.dijkstra(st); ok = ed;
vector<int> ans, ans1;
while (ok != -1) {
ans.push_back(ok);
ok = time.path[ok];
}
ok = ed;
while (ok != -1) {
ans1.push_back(ok);
ok = way.path[ok];
} if (ans1 == ans) {
cout << "Time = " << time.dis[ed] << "; ";
cout << "Distance = " << way.dis[ed] << ": ";
for (int i = ans1.size() - 1; i >= 0; i --) {
cout << ans1[i] ;
if (i) cout << " => ";
else cout << '\n';
}
} else {
cout << "Time = " << time.dis[ed] << ": ";
for (int i = ans.size() - 1; i >= 0; i --) {
cout << ans[i] ;
if (i) cout << " => ";
else cout << '\n';
}
cout << "Distance = " << way.dis[ed] << ": ";
for (int i = ans1.size() - 1; i >= 0; i --) {
cout << ans1[i] ;
if (i) cout << " => ";
else cout << '\n';
}
} return 0;
}

SMU 2024 spring 天梯赛3的更多相关文章

  1. 【CCCC天梯赛决赛】

    cccc的天梯赛决赛,水题一样的水,中档题以上的还是没做出来.补了一下题,觉得其实也不是很难,主要是练的少. L2-1:红色预警 并查集 我做的时候想不到并查集,想到了也不一定做的出来,都是其实不难. ...

  2. 记第一届 CCCC-团体程序设计天梯赛决赛 参赛

    其他都没什么,上午报道,下午比赛两个半小时,最后139分 但四我超遗憾的是,最后在做L3-1二叉搜索树,因为看到有辣么多人做出来,可是我没做出来啊 比赛结束后看了看其他两道当场吐血,L3-3直捣黄龙不 ...

  3. L1-049 天梯赛座位分配​​​​​​​

    L1-049 天梯赛座位分配 (20 分) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i ...

  4. 团体程序设计天梯赛(CCCC) L3021 神坛 的一些错误做法(目前网上的方法没一个是对的) 和 一些想法

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  5. 团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  6. 团体程序设计天梯赛(CCCC) L3015 球队“食物链” 状态压缩

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code #include <cstdio> #include ...

  7. 第四届CCCC团体程序设计天梯赛 后记

    一不小心又翻车了,第二次痛失200分 1.开局7分钟A了L2-3,一看榜已经有七个大兄弟排在前面了,翻车 * 1 2.把L1-3 A了18分,留了两分准备抢顽强拼搏奖,最后五秒钟把题过了,万万没想到还 ...

  8. 团体程序设计天梯赛(CCCC) L3014 周游世界 BFS证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  9. 团体程序设计天梯赛(CCCC) L3013 非常弹的球 不同思路

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code

  10. 团体程序设计天梯赛(CCCC) L3012 水果忍者 上凸或下凹的证明

    团体程序设计天梯赛代码.体现代码技巧,比赛技巧.  https://github.com/congmingyige/cccc_code #include <cstdio> #include ...

随机推荐

  1. 11-DNS域名解析服务

    背景 我们都知道,用ip可以唯一标识互联网上的主机. 从前,互联网的主机非常的少.我们都可以记住每台Server的ip. 就像是大哥大时期,电话非常少,电话号码也就非常少,我们都能记住某个人的电话. ...

  2. Atcoder Beginner Contest 324 G Generate Arrays 题解-Treap

    为了更好的阅读体验,请点击这里 题目链接 套上平衡树板子就能做的很快的题,然后因为是指针存树,因此交换只需要把序列大小较小的挨个拿出来插到相应的地方即可.复杂度 \(O(N \log^2 N)\). ...

  3. 实验13.Nat转发telnet实验

    # 实验13.Nat转发telnet实验 本节用于测试NAT服务,用于将流量转发到内网的指定设备上. 实验组 配置路由器 由于之前配置过ospf,所以这次用直接指静态练手,首先确保全网畅通 R3 GW ...

  4. Xilinx ZYNQ-7000 平台简介

    平台介绍 Zynq7000是赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平. 在2010 ...

  5. 【论文阅读】BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal

    论文题目:BEVFormer: Learning Bird's-Eye-View Representation from Multi-Camera Images via Spatiotemporal ...

  6. 一文了解Spring Boot启动类SpringApplication

    本文分享自华为云社区<[Spring Boot 源码学习]初识 SpringApplication>,作者: Huazie. 引言 往期的博文,Huazie 围绕 Spring Boot  ...

  7. ABP框架开发实例教程-生成框架代码

    ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称.ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB ...

  8. VulnHub-Narak靶机渗透流程

    VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...

  9. Oracle 日期减年数、两日期相减

    -- 日期减年数 SELECT add_months(DEF_DATE,12*USEFUL_LIFE) FROM S_USER --两日期相减 SELECT round(sysdate-PEI.STA ...

  10. 首届 DIVE 精彩回顾丨践行企业数字化,基础软件如何创新

    "墙高基下,虽得必失."在构建数字企业大厦的工程中,基础软件的重要性不言而喻.但对于各行各业而言,面向传统经营模式设计的基础软件已经难以支撑数字业务的创新,唯有汲取专业团队的经验, ...