2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)

前言

补题只补了前四道,第五题打个暴力都有 \(24\) 分,我这死活只有 \(22\) 分 \(QAQ\)

RC-u1 大家一起查作弊

思路

按题意模拟。

不过很奇怪赛时用 getline 老是读入不了,还好换成 cin 直接读也问题不大。

代码

#include <bits/stdc++.h>

using namespace std;

int  main() {
ios::sync_with_stdio(false);
cin.tie(0); auto check0 = [](char c)->bool{
bool res = 0;
if (c >= '0' && c <= '9') res = 1;
if (c >= 'a' && c <= 'z') res = 1;
if (c >= 'A' && c <= 'Z') res = 1;
return res;
}; auto check1 = [](string s)->int{
int res = 0;
for (int i = 0; i < s.size(); i ++) {
if (s[i] >= '0' && s[i] <= '9')
res ++;
}
return res;
}; auto check2 = [](string s)->int{
int res = 0;
for (int i = 0; i < s.size(); i ++) {
if (s[i] >= 'a' && s[i] <= 'z')
res ++;
}
return res;
}; auto check3 = [](string s)->int{
int res = 0;
for (int i = 0; i < s.size(); i ++) {
if (s[i] >= 'A' && s[i] <= 'Z')
res ++;
}
return res;
}; vector<string> a;
string s;
while (cin >> s) {
for (int i = 0; i < s.size(); i ++) {
if (check0(s[i])) {
int j = i + 1;
while (j < s.size() && check0(s[j])) {
j ++;
}
a.emplace_back(s.substr(i, j - i));
i = j;
}
}
} int ans1 = 0, ans2 = 0;
for (auto s : a) {
ans2 += s.size();
int x = check1(s), y = check2(s), z = check3(s);
if (x && y && z) ans1 += 5;
else if (x && (y || z)) ans1 += 3;
else if (y && z) ans1 += 1;
} cout << ans1 << '\n' << ans2 << ' ' << a.size() << '\n'; return 0;
}

RC-u2 谁进线下了?II

思路

按题意模拟,注意不要输出未参赛的队伍分数。

代码

#include <bits/stdc++.h>

using namespace std;

int  main() {
ios::sync_with_stdio(false);
cin.tie(0); auto get = [](int x)->int{
if (x == 1) return 25;
if (x == 2) return 21;
if (x == 3) return 18;
return 20 - x;
}; int n;
cin >> n; vector<array<int, 2>> a(31); for (int i = 1; i <= 30; i ++) {
a[i][1] = i;
} set<int> ok;
while (n--) {
for (int i = 1; i <= 20; i ++) {
int c, p;
cin >> c >> p;
a[c][0] += get(p);
ok.insert(c);
}
} sort(a.begin() + 1, a.end(), [](auto x, auto y) {
if (x[0] == y[0]) return x[1] < y[1];
return x[0] > y[0];
}); for (int i = 1; i <= 30; i ++) {
if (ok.count(a[i][1])) {
cout << a[i][1] << ' ' << a[i][0] << '\n';
}
} return 0;
}

RC-u3 势均力敌

思路

赛后听佬们说有规律,不过我是蠢比找不出规律,只好写暴力了 \(\dots\)

考虑到 \(4!=24\),直接暴力搜索有 \(2^{24}\) 会超时,那就双向搜索好了,要找两个集合,使其平方和相等, 枚举一半 \(2^{12}\) 找到两个集合各一半的和假设为 \([a,b]\),再枚举另一半找到的和假设为 \([c,d]\),那么有 \(a+c=b+d\),即 \(a-b=d-c\),所以我们只要存下差值即可,然后还要存下两个集合中选的数有没有一半,这里我是直接判断状态中 \(1\) 的个数有没有一半,找到了就直接输出。

代码

#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

int  main() {
ios::sync_with_stdio(false);
cin.tie(0); int n;
cin >> n; vector<int> a(n + 1);
for (int i = 1; i <= n; i ++)
cin >> a[i]; vector<int> num;
int vis[5] {};
auto dfs = [&](auto & self, int x, int res)->void{
if (x == n) {
num.emplace_back(res);
return ;
} for (int i = 1; i <= n; i ++) {
if (!vis[i]) {
vis[i] = 1;
self(self, x + 1, res * 10 + a[i]);
vis[i] = 0;
}
}
}; dfs(dfs, 0, 0); int y = 1;
for (int i = 1; i <= n; i ++)
y *= i; y /= 2; auto print = [&](int a, int b)->void{
for (int i = 0; i < y; i ++) {
if (a >> i & 1) {
cout << num[i] << '\n';
}
}
for (int i = 0; i < y; i ++) {
if (b >> i & 1) {
cout << num[i + y] << '\n';
}
}
}; map<i64, vector<int>> mp;
for (int i = 1; i < (1 << y); i ++) {
i64 f = 0, res1 = 0, res0 = 0;
for (int j = 0; j < y; j ++) {
if (i >> j & 1) {
res1 += num[j] * num[j];
} else {
res0 += num[j] * num[j];
}
}
mp[res1 - res0].push_back(i);
} for (int i = 1; i < (1 << y); i ++) {
i64 f = 0, res1 = 0, res0 = 0;
for (int j = 0; j < y; j ++) {
if (i >> j & 1) {
res1 += num[j + y] * num[j + y];
} else {
res0 += num[j + y] * num[j + y];
}
}
if (mp.count(res0 - res1)) {
for (auto st : mp[res0 - res1]) {
if (__builtin_popcount(i) + __builtin_popcount(st) == y) {
print(st, i);
return 0;
}
}
}
} return 0;
}

RC-u4 City 不 City

思路

赛中只拿了 20 分,后来没时间 debug 了,赛后来改了几行就过了 \(\dots\)

很一眼的 \(dijkstra\),但是需要维护路径上的最高热度值,所以添加一个 \(path\) 数组维护路径上除起点和终点以外的最大热度值最小即可。

代码

#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

int  main() {
ios::sync_with_stdio(false);
cin.tie(0); int n, m, s, t;
cin >> n >> m >> s >> t; vector<int> a(n + 1);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
} vector<vector<pair<int, int>>> g(n + 1);
for (int i = 0; i < m; i ++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
} vector<int> dis(n + 1, 1e9), path(n + 1);
priority_queue<array<int, 2>> Q; dis[s] = 0;
Q.push({0, s});
while (Q.size()) {
auto [d, u] = Q.top();
Q.pop(); if (dis[u] < d) continue; for (auto [v, w] : g[u]) {
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
Q.push({ -dis[v], v});
if (v != t) {
path[v] = max(path[u], a[v]);
} else {
path[v] = path[u];
}
} else if (dis[v] == dis[u] + w) {
path[v] = min(max(a[v], path[u]), path[v]);
}
}
} if (dis[t] == 1e9) {
cout << "Impossible\n";
} else {
cout << dis[t] << ' ' << path[t] << '\n';
} return 0;
}

RC-u5 贪心消消乐

思路

唉不太会,听别人说写个二维前缀和暴力都能有 \(24\) 分来着,我后来改了好久也只会 \(22\) 分的,等之后改完了再重新更新下吧。

大概思路就是, \(n^3\) 的前缀和扫描每行的最大子段和 \(dp\),会 wa 第二个和最后一个点,想不明白。

哦对了,这个傻逼题还把行和列反着给,一个样例给我硬控几分钟,wok。

代码

#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

int  main() {
ios::sync_with_stdio(false);
cin.tie(0); int n;
cin >> n; const int inf = -5e5; vector a(n + 1, vector<int>(n + 1));
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
cin >> a[j][i];
if (!a[j][i])
a[j][i] = inf;
}
} auto Min = [](array<int, 5> &x, array<int, 5> &y)->array<int, 5> {
if (x[0] != y[0])
return x[0] > y[0] ? x : y;
if (x[1] != y[1])
return x[1] < y[1] ? x : y;
if (x[2] != y[2])
return x[2] < y[2] ? x : y;
if (x[3] != y[3])
return x[3] < y[3] ? x : y;
return x[4] < y[4] ? x : y;
}; int ans = 0;
while (true) {
// for (int i = 1; i <= n; i ++)
// for (int j = 1; j <= n; j ++)
// cout << a[i][j] << " \n"[j == n];
array<int, 5> res{inf, 0, 0, 0, 0};
for (int i = 1; i <= n; i ++) {
vector<int> pre(n + 1);
for (int j = i; j <= n; j ++) {
vector<array<int, 2>> dp(n + 1);
// cout << i << ' ' << j << ":\n";
for (int k = 1; k <= n; k ++) {
pre[k] += a[j][k];
// cout << pre[k] << " \n"[k == n];
}
for (int k = 1; k <= n; k ++) {
dp[k][1] = k;
if (k > 1 && dp[k - 1][0] + pre[k] > dp[k][0]) {
dp[k] = dp[k - 1];
}
dp[k][0] += pre[k];
array<int, 5> t = {dp[k][0], i, dp[k][1], j, k};
res = Min(res, t);
}
}
} if (res[0] <= 0) {
break;
} ans += res[0];
auto [v, x1, y1, x2, y2] = res;
cout << '(' << x1 << ", " << y1 << ") (" << x2 << ", " << y2 << ") " << v << '\n'; int len = y2 - y1 + 1, no = -1e5;
for (int i = x1; i <= x2; i ++) {
for (int j = y1; j <= y2; j ++) {
a[i][j] = no;
}
for (int j = n; j >= 1; j --) {
if (a[i][j] != no) {
int k = j;
while (k + 1 <= n && a[i][k + 1] == no) {
swap(a[i][k], a[i][k + 1]);
k ++;
}
}
}
for (int j = 1; j <= n; j ++) {
if (!a[i][j]) {
a[i][j] = inf;
}
}
}
} cout << ans << '\n'; return 0;
}

2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)的更多相关文章

  1. 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名

    蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...

  2. 国内第一本micropython的书出版《机器人Python极客编程入门与实战》

    第一本micropython的书<机器人Python极客编程入门与实战>. 购买地址:https://item.taobao.com/item.htm?spm=2013.1.w4018-1 ...

  3. 2014年spark开发者大赛火热进行中!

    “发现最有正能量的网络达人”,Spark开发者大赛火热进行! 2014年9月30日,2014 Spark开发者大赛在北京正式启动.本次大赛由Spark亚太研究院联合国内领先的IT技术创新与发展的互联网 ...

  4. 这里有40条提升编程技能小妙招!还有TIOBE 7月份的编程语言排行榜

    如何提高编程技能?恐怕很多开发者思考过这个问题.最近,拥有将近 15 年开发经验的软件工程师 Kesk -*- 写了一篇博客,列举了 40 条对其职业生涯有所帮助的事项.   或许,通过以下 40 个 ...

  5. 那些在GitHub能提高你的编程技能的项目

    1.免费的编程书籍 免费的开发手册 167K Repo:github.com/EbookFoundation/free-programming.. 2. 很棒的话题 包含了各种有趣的话题 148k R ...

  6. 现代Web应用开发者必备的六大技能

    过去,应用开发需要注重大量的专业知识,程序员只需关注单一的语言(比如COBOL.RPG.C++等),并利用该语言创建应用.而如今,时代在变迁.Web不再是单单关注独立的一面.相反,一个现代化的Web应 ...

  7. 给 JavaScript 开发者讲讲函数式编程

    本文译自:Functional Programming for JavaScript People 和大多数人一样,我在几个月前听到了很多关于函数式编程的东西,不过并没有更深入的了解.于我而言,可能只 ...

  8. 开发者大赛 | aelf轻型DApp开发训练大赛结果公布!

    6月9日,由aelf基金会发起的轻型DApp开发训练大赛圆满收官.本次训练赛基于aelf公开测试网展开,主要针对轻型DApp,旨在激励更多的开发者参与到aelf生态中来. 活动于4月21日上线后,ae ...

  9. 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取

    paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...

  10. 2018百度之星开发者大赛-paddlepaddle学习

    前言 本次比赛赛题是进行人流密度的估计,因为之前看过很多人体姿态估计和目标检测的论文,隐约感觉到可以用到这次比赛上来,所以趁着现在时间比较多,赶紧报名参加了一下比赛,比赛规定用paddlepaddle ...

随机推荐

  1. EMQX配置ssl/tls双向认证+SpringBoot项目整合MQTT_真实业务实践

    一.使用docker搭建Emqx 1.拉取emqx镜像 docker pull emqx/emqx:5.7 2.运行 docker run -d --name emqx emqx/emqx:5.7 3 ...

  2. linux中cp复制时处理软链接的两种方式

    linux中cp复制时处理软链接的两种方式 cp -r -L 复制原始文件 cp -r -P 复制软链接本身

  3. .NET6 个人博客-推荐文章加载优化

    个人博客-推荐文章加载优化 前言 随着博客文章越来越多,那么推荐的文章也是越来越多,之前推荐文章是只推荐8篇,但是我感觉有点少,然后也是决定加一个加载按钮,也是类似与分页的效果,点击按钮可以继续加载8 ...

  4. C# 温故知新 第三篇 C# 编程概念 之程序集

    在微软C# 官方开发指南中,介绍到在C# 开发中设计到这些 编程概念 当然包括不限于这些: 程序集:程序集构成了 .NET 应用程序的部署.版本控制.重用.激活范围和安全权限的基本单元. 程序集是为协 ...

  5. .Net Core 2.2 Areas 路由,第一个MapAreaRoute 设置匹配多个Controller

    .h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px } 在.Net ...

  6. 在Docker中搭建rabbit MQ集群 (Mac + OrbStack)

    我以为用docker搭建一个rabbitMq集群会非常简单,但是结果却出乎意料,我花了差不多两个半天才搞定.这还是依赖了AI的协助,否则难度不敢想象. 我的环境是Mac上的OrbStack.用了Kim ...

  7. 工控CTF_MMS

    工控CTF_MMS 参考文章 https://blog.csdn.net/song123sh/article/details/127358610 概况 MMS工控协议是基于MMS和TCP等的基础上,开 ...

  8. Mysql 日期查询今天、昨天、近7天、近30天、本月、上一月、本季

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  9. 一文全懂:Linux磁盘分区

    一.物理设备的命名规则 在 Linux 系统中一切都是文件,硬件设备也不例外.所有的硬件设备文件都在/dev文件夹中. 硬件 在Linux内的文件名 SCSI/SATA/USB /dev/sd[a-p ...

  10. 靶机: Chronos

    靶机: Chronos 准备 靶机:https://www.vulnhub.com/entry/chronos-1,735/ 使用 VirtualBox 网络 Host-Only 配置网络环境:htt ...