2022 RoboCom 世界机器人开发者大赛-本科组(国赛)

这篇具有很好参考价值的文章主要介绍了2022 RoboCom 世界机器人开发者大赛-本科组(国赛)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RC-u1 智能红绿灯

题意:为绿灯时,点击按钮后15s后转为红色持续30s,为红灯时再点击按钮则延长15s并只能延长一次,其它操作无效。

题解:模拟题,需要注意的是按下按钮后15s转为红灯后的点亮时间是闭区间,如第1s按下,红灯显示区间为[16, 45],在这个区间再次点击按钮时才能延长红灯时间。

代码:文章来源地址https://www.toymoban.com/news/detail-638658.html

// AC
#include <bits/stdc++.h>

using namespace std;
#define PII pair<int, int>
const int N = 1e4+10;
int a[N];
int n;
int flag, l, r, color;
vector<PII> v;

int main()
{
	cin >> n;
	for(int i = 0;i < n;i ++)
	{
		cin >> a[i];
		int x = a[i];
		if(i && a[i] == a[i-1]) continue;
		// 绿转红
		if(!color) {
			l = x + 15;
			r = l + 29;
			flag = 0;
			color = 1;
		}
		// 再次点击 注意红灯区间
		else if(color && !flag && r >= x && l <= x) {
			r = r + 15;
			flag = 1;
		}
		// 红转绿 
		else if(color && r < x) {
			color = 0;
			if(!v.size() || v.back() != make_pair(l, r)) v.push_back(make_pair(l, r));
			// 绿转红
			l = x + 15;
			r = l + 29;
			flag = 0;
			color = 1;
		}
	}
	if(!v.size() || v.back() != make_pair(l, r)) v.push_back(make_pair(l, r));
	for(int i = 0;i < v.size();i ++)
	{
		cout << v[i].first << ' ' << v[i].second << endl;
	}
	return 0;
}

RC-u2 女王的大敕令

题意:在5*5方格中给定终点,上下左右四个方向的怪物,在初始位置时,左右怪物顺时针移动相应行数后进行整行的激光覆盖,在移动一次位置后,上下怪物顺时针移动相应列数后进行整列的激光覆盖,您需要保证确定初始位置和移动一次后的位置,并且这两个位置不会被怪物的激光覆盖,然后可以通过指定步数到达终点。

题解:模拟题,需要注意的是初始位置时是左右两侧怪物移动,上下怪物位置保持不变,而第一次移动位置后是上下两侧怪物移动,左右怪物位置保持不变。我们可以推断出初始和第一次移动后的安全位置,然后4重循环枚举这两个位置,通过移动距离相等来判断是否满足条件,最后排序输出。

代码:

//AC
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5;
int mp[6][6], mp2[6][6];
int c1, c2, r1, r2;
int n[5];
int r, c, d1, d2;
int idx;

struct node
{
	int x, y, x2, y2;
}no[N];

bool cmp(node x, node y)
{
	if(x.x == y.x && x.y == y.y && x.x2 == y.x2) return x.y2 < y.y2;
	else if(x.x == y.x && x.y == y.y) return x.x2 < y.x2;
	else if(x.x == y.x) return x.y < y.y;
	else return x.x < y.x;
}

int main()
{
	cin >> c1 >> c2 >> r1 >> r2;
	for(int i = 1;i <= 4;i ++) cin >> n[i];
	cin >> r >> c >> d1 >> d2;
	// 左右两侧怪物移动后的激光覆盖情况 
	for(int i = 1;i <= 5;i ++)
	{
		mp[i][c1] = 1;
		mp[i][c2] = 1;
		mp[r1-n[3]][i] = 1;
		mp[r2+n[4]][i] = 1;
	}
	// 上下两侧怪物移动后的激光覆盖情况
	for(int i = 1;i <= 5;i ++)
	{
		mp2[i][c1+n[1]] = 1;
		mp2[i][c2-n[2]] = 1;
		mp2[r1-n[3]][i] = 1;
		mp2[r2+n[4]][i] = 1;
	} 
	// 枚举两个位置
	for(int i = 1;i <= 5;i ++)
	{
		for(int j = 1;j <= 5;j ++)
		{
			if(!mp[i][j]) 
			{
				for(int i1 = 1;i1 <= 5;i1 ++)
				{
					for(int j1 = 1;j1 <= 5;j1 ++)
					{
						if(!mp2[i1][j1])
						{
							// 判断曼哈顿距离
							int dd2 = abs(r-i1) + abs(c-j1);
							int dd1 = abs(i1-i) + abs(j1-j);
							if(dd2 == d2 && dd1 == d1)
							{
								no[idx].x = i;
								no[idx].y = j;
								no[idx].x2 = i1;
								no[idx].y2 = j1;
								idx ++;
							}
						}
					}
				}
			}
		}
	}
	// 排序输出
	sort(no, no+idx, cmp);
	for(int i = 0;i < idx;i ++)
	{
		cout << no[i].x << ' ' << no[i].y << ' ';
		cout << no[i].x2 << ' ' << no[i].y2 << endl;
	}
	return 0;
}

RC-u3 战利品分配

题意:给定边权为1的无向图,从起点到终点距离最短并且指定距离点权和最大。

题解:bfs,当到达终点后统计最大点权和,需要注意的是起点到终点距离最短,超过这个距离后的答案无效,终止。

代码:

// AC
#include <bits/stdc++.h>

using namespace std;
const int N = 1e5+10;
unordered_map<int, int> mp;
vector<int> v[N];
int w[N], vis[N];
int n, m, k, p;
int s, t;
int res, minn = 0x3f3f3f3f;

struct node
{
	// 节点 步数 答案 
	int no, st, ww;
};

void add(int x, int y)
{
	// 判断是否出现过该边 可以省略
	if(mp.count(x) && mp[x] == y) return;
	mp[x] = y;
	v[x].push_back(y);
}

void bfs()
{
	queue<node> q;
	int ww = 0;
	// 注意p=1情况
	if(p == 1) ww = w[s];
	// 步数为0方便计算
	q.push({s, 0, ww});
	
	while(q.size())
	{
		node tt = q.front();
		q.pop();
		vis[tt.no] = 1;
		// 超过最短距离直接终止
		if(tt.st > minn) break;
		// 更新答案和最短距离 
		if(tt.no == t)
		{
			minn = tt.st;
			res = max(res, tt.ww);
			continue;
		}
		for(int i = 0;i < v[tt.no].size();i ++)
		{
			int u = v[tt.no][i];
			// 注意终点可以多次访问
			if(!vis[u] || u == t)
			{
				vis[u] = 1;
				int no = u;
				int st = tt.st + 1;
				int ww = tt.ww;
				if(st%k + 1 == p) ww += w[u];
				q.push({no, st, ww});
			}
		}
	}
}

int main()
{
	cin >> n >> m >> k >> p;
	for(int i = 1;i <= n;i ++) cin >> w[i];
	for(int i = 0;i < m;i ++)
	{
		int x, y;
		cin >> x >> y;
		if(x != y)
		{
			add(x, y);
			add(y, x);
		}
	}
	cin >> s >> t;
	bfs();
	cout << res << endl;
	return 0;
}

RC-u4 变牛的最快方法

题意:最短编辑距离+记录路径

题解:动规找出所需要的最少操作数,并记录路径

代码:

// AC
#include <bits/stdc++.h>

using namespace std;
#define PII pair<int, int>
const int N = 1010;
vector<int> ans;
int f[N][N], op[N][N];
PII pre[N][N];
vector<int> s1, s2;
int n, m, x, y;

void init()
{
	// 边界值初始化
	for(int i = 0;i <= n;i ++) f[i][0] = i, op[i][0] = 0, pre[i][0] = {i-1, 0};
	for(int i = 0;i <= m;i ++) f[0][i] = i, op[0][i] = 3, pre[0][i] = {0, i-1};
}

int main()
{
	s1.push_back(0);
	cin >> x;
	while(x != -1)
	{
		s1.push_back(x);
		cin >> x;
	}
	
	s2.push_back(0);
	cin >> y;
	while(y != -1)
	{
		s2.push_back(y);
		cin >> y;
	}
	n = s1.size()-1;
	m = s2.size()-1;
	init();
	for(int i = 1;i <= n;i ++)
	{
		for(int j = 1;j <= m;j ++)
		{
			// 是否需要修改
			int flag = 1;
			if(s1[i] == s2[j]) flag = 0;
			int del = f[i-1][j] + 1;
			int add = f[i][j-1] + 1;
			int upd = f[i-1][j-1] + flag;
			f[i][j] = min(del, min(add, upd));
			// 记录操作类型和位置  
			if(f[i][j] == del)
			{
				op[i][j] = 0;
				pre[i][j] = {i-1, j};
			}
			else if(f[i][j] == add)
			{
				op[i][j] = 3;
				pre[i][j] = {i, j-1};
			}
			else
			{
				// 更新 
				if(flag) op[i][j] = 1;
				else op[i][j] = 2;
				pre[i][j] = {i-1, j-1};
			}
		}
	}
	cout << f[n][m] << endl;
	ans.push_back(op[n][m]);
	PII t = pre[n][m];
	while(t.first || t.second)
	{
		int i = t.first, j = t.second;
		ans.push_back(op[i][j]);
		t = pre[i][j];
	}
	reverse(ans.begin(), ans.end());
	for(int x : ans) cout << x;
	return 0;
}

RC-u5 养老社区

题意:给定一棵树,每个节点有一个类型,需要找出本质不同的三元组个数,即3个节点的类型各不相同,并且两两之间的最短距离相同。

题解:n次bfs找出每两节点之间的最短距离,3重循环判断每3个节点是否满足要求。

代码:

// AC
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2020;

vector<int> G[maxn];
int n, t[maxn];

int vis[maxn], e[maxn][maxn];
void bfs(int x){
    queue<int> q;
    q.push(x);
    vis[x] = 1;
    while(q.size()){
        int u = q.front();
        q.pop();
        for(int to : G[u]){
            if(vis[to])continue;
            vis[to] = 1;
            e[x][to] = e[x][u]+1;
            q.push(to);
        }
    }
}

int main(){
    cin >> n;
    for(int i = 1; i < n; i++){
        int u ,v ; 
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i = 1; i <= n; i++) cin >> t[i];
    // bfs求任意2节点距离
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) vis[j] = 0;
        bfs(i);
    }
    // 枚举3个节点
    int cnt = 0;
    for(int i = 1; i <= n; i++){
        for(int j = i+1; j <= n; j++){
            for(int k = j+1; k <= n; k++){
            	// 判断距离 注意由于数据量 这里的条件不能交换
                if(e[i][j]==e[j][k] && e[i][j]==e[i][k]){
                	// 判断类型
                    if(t[i]!=t[j] && t[i]!=t[k] && t[j]!=t[k]){
                        cnt++;
                    }
                }
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

到了这里,关于2022 RoboCom 世界机器人开发者大赛-本科组(国赛)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)R4,R5题解

    就是给你一堆操作修改上面的数组让他变成下面数组,输出最小修改次数和方案 一眼dp,跑一遍dp记录方案数即可; dp[i][j]表示从左往右修改,第一个数组的i位等于第二个数组的j位的最小修改方案. c++能过代码 输入样例 输出样例 思路 先lca搞出来任意两点之间的距离。然后按

    2024年02月12日
    浏览(21)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-- 第二题 智能服药助手 (已完结)

    其它题目 RC-u2 智能服药助手 智能看护中很重要的环节是安排需要服药的老年人的服药计划。 已知机器人需要照顾的某位老年人需要服用 N 种药物,但某些药物不宜间隔过短服用 —— 比如降糖药一般遵医嘱日服 3 次,两次之间需要间隔至少 4 小时。当需要服用的药物比较多

    2024年02月16日
    浏览(16)
  • 2022 Robocom世界机器人开发者大赛 CAIP编程赛道 本科组-决赛 挨打记录+题解

    打完决赛本菜鸡可以退役辣!并不是很开心因为上学期的考试还没复习完,哭了TAT 由于PTA还没有上架题目,只能描述个大概,各位姥爷见谅 给定一串时间序列,表示在什么时刻按了开关。在按下之后的15秒后会变绿灯,持续30秒,如果在持续期间有再次被按下则延长15秒,只

    2024年02月16日
    浏览(22)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-- 第五题 树与二分图 (已完结)

    其它题目 RC-u5 树与二分图 设 G=(V,E) 是一个无向图,如果顶点集合 V 可分割为两个互不相交的子集 (A,B),并且每条边 (i,j)∈E 的两个端点 i 和 j 分别属于这两个不同的顶点子集,则称图 G 为一个二分图。 现在给定一棵树 T,要求选择树中两个没有边相连的结点 i 和 j,使得将无

    2024年02月16日
    浏览(15)
  • 2022 RoboCom 世界机器人开发者大赛-高职组 国赛(RC-v3 智能护理中心统计)

    题意: 给出各管理节点的关系,和每个管理节点的照护老人数量。 两种操作:1. 转院. 2. 查询 该管理节点以下总的老人人数. 知识点: 树。

    2024年02月15日
    浏览(18)
  • 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)

    比赛介绍 比赛信息 比赛官网:https://www.robocom.com.cn/ 报名流程:https://www.robocom.com.cn/content.html?cid=386 工信部发文:https://www.robocom.com.cn/content.html?cid=367 中国教育学会清单:https://m.cahe.edu.cn/site/content/14825.html 编程赛道通知:https://www.robocom.com.cn/content.html?cid=369 赛制说明: CAIA数

    2024年02月16日
    浏览(17)
  • 2021 RoboCom 世界机器人开发者大赛-高职组(初赛)

    编程题得分:100  总分:100 目录 7-1 机器人打招呼 (5分) 输入格式: 输出格式: 输入样例: 输出样例: 7-2 人脸识别 (10分) 输入格式: 输出格式: 输入样例 1: 输出样例 1: 输入样例 2: 输出样例 2: 7-3 月份输出 (10分) 输入格式: 输出格式: 输入样例: 输出样例: 7-4 字

    2024年02月12日
    浏览(21)
  • 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)

    官方题解 分数 20 7-1 冒险者分队 一个莫名其妙的思维 分数 25 7-2 拼题A打卡奖励 01背包的变形,在面临超时的情况下,明智的选择另一种作为限制 分数 25 7-3 快递装箱 大模拟,没拿到满分,就十六分,不想改了,累了 分数 30 7-4 塔防游戏 头一次写二位最短路

    2024年02月16日
    浏览(17)
  • 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)

    1.绿地围栏 思路 模拟题目,主要是记住最后要把原点加入到目标点当中,不然最后一个测试点过不了。 代码 2.队列插入 思路× 不太会,每理解大佬的思路,以后有机会补 代码× 3.账户安全预警 输入样例1 输出样例1 输入样例2 输出样例2 思路 嵌套map,用外层map的键表示邮箱,

    2024年02月16日
    浏览(13)
  • 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)题解

    市政规划了一块绿地,需要采购一批围栏将绿地围起来。 为了简单起见,我们假设绿地的形状是个封闭连通的规则多边形,即所有边都是互相垂直或平行的,并且没有交叉的十字边。我们指定某条垂直边上的一个点为原点 (0,0),然后按照顺时针记录这个多边形的拐角顶点的位

    2024年02月14日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包