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. 更难、更好、更快、更强:LLM Leaderboard v2 现已发布

    摘要 评估和比较大语言模型 (LLMs) 是一项艰巨的任务.我们 RLHF 团队在一年前就意识到了这一点,当时他们试图复现和比较多个已发布模型的结果.这几乎是不可能完成的任务:论文或营销发布中的得分缺 ...

  2. Linux设备模型:4、sysfs

    作者:wowo 发布于:2014-3-14 18:31 分类:统一设备模型 http://www.wowotech.net/device_model/dm_sysfs.html 前言 sysfs是一个 ...

  3. ARM GIC 系列文章学习(转)

    原文来自:骏的世界 ARM GIC(一) cortex-A 处理器中断简介 对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理.本系列博文,是以ARM corte ...

  4. 【仿真】Carla简易安装 Window Ubuntu均适用 附ROS的简单连接 [0]

    参考与前言 CARLA Documentation 官方文档 后续链接:[仿真]Carla介绍与使用 [1] 本篇创建于 2020/12/18,安装方式为压缩包安装,无需UE4等软件,但是前提是需要一 ...

  5. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-1-环境准备与搭建

    1.简介 Python+Playwright系列的文章还没有结束,就有好的小伙伴或者童鞋们私信公众号留言,问宏哥什么时候出Java语言的Playwright的自动化测试文章.本来想趁热打铁将Pytho ...

  6. vulhub - INFOSEC PREP: OSCP

    vulhub - INFOSEC PREP: OSCP 信息收集 nmap 192.168.157.0/24 nmap -sT --min-rate 10000 -p- 192.168.157.162 ...

  7. window10设置开机自启动exe的三种方式(亲测有效)

    拷贝文件到自启动位置 路径地址:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 通过组策略设置脚本随服务器启动 开始-> ...

  8. Java-Response对象设置响应消息

    功能:设置响应消息 1.设置响应行 格式:HTTP/1.1 200 OK 设置状态码:setStatus(int sc) 2.设置响应头:setHeader(String name,String va ...

  9. iOS开发基础99-内购in_app

    今天后台支付校验模块报错,拿到凭证去苹果校验返回的结果如下: { "receipt": { "receipt_type": "Production&q ...

  10. canvas绘制飞线效果

    在我们做的可视化大屏项目中,经常会遇到飞线的效果. 在我们的大屏编辑器中,可以通过拖拽+配置参数的方式很快就能够实现.下面是我们使用大屏编辑器实现的一个项目效果: 中间地图就有飞线的效果. 抛开编辑器 ...