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. Mysql 聚合函数嵌套使用

    Mysql 聚合函数嵌套使用 目的:Mysql 聚合函数嵌套使用 聚合函数不可以直接嵌套使用,比如: max(count(*)) 思路:但是可以嵌套子查询使用(先分组取出count值, 再将count ...

  2. STM32 CubeMX 学习:003-定时器

    背景 上一讲 STM32 CubeMX 学习:外部中断的使用 介绍了如何配置以及操作GPIO外部中断. 这一讲我们介绍定时器的有关概念,并对其中一种进行示范. HOST-OS : Windows-10 ...

  3. WPF在.NET9中的重大更新:Windows 11 主题

    在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论. 对三个事项发起了投票. 第一个是Windows 11 主题 第二个是更新的控件 第三个是可空性注释 最终Windo ...

  4. Android案例分享,基于瑞芯微RK3568国产平台!

    开发环境说明 Windows开发环境:Windows7 64bit.Windows10 64bit 虚拟机:VMware15.5.5 AndroidSDK编译环境:Ubuntu18.04.4 64bi ...

  5. gdb 根据c语言二进制文件进程号查看内部多线程任务

    C语言二进制文件 a 编译时添加了 -g (gdb 调试), 但是 gdb a 这种方式有时不容易复现一些场景.这时可以先正常启动 a, 然后根据 a 的进程号启动gdb调试. # 1. 找到程序进程 ...

  6. DASCTF X GFCTF 2024|四月开启第一局 [PWN]详解

    DASCTF X GFCTF 2024|四月开启第一局[PWN] wp(详解) 1.dynamic_but_static 题目保护情况 64位程序,没有开canary和pie保护,got表可改 64位 ...

  7. mac navicat免激活版

    Navicat 12 第一步:终端执行 sudo spctl --master-disable 第二步:下载安装即可使用 https://pan.baidu.com/s/1tHq-wqAIggD0Fo ...

  8. Oracle 启用、禁用触发器

    基本语法 启用指定表中所有触发器(trigger) alter table table_name enable all triggers; 语法: alter table 表名 enable all ...

  9. Git 奇幻之旅⌛️续集

    第十二天:暂存未完成的修改 小明和小红在开发一个新功能时,他们需要切换到另一个分支去修复一个紧急的 bug .但是他们的当前分支上还有一些未完成的修改,他们不想提交这些修改,也不想丢弃这些修改.有一天 ...

  10. C#枚举高级应用

    文章开头先看一道题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开 ...