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

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

官方题解

官方题解

7-1 冒险者分队

分数 20
7-1 冒险者分队

一个莫名其妙的思维

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
// const int N = 
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

int a, b, c, x, y, z;

signed main()
{
	fast;
	int t;
	cin >> t;
	while(t --)
	{
		cin >> a >> b >> c >> x >> y >> z;

		if(a == x && b == y && c == z)
        {
            cout<<0<<endl;
            continue;
        }

		int xx = x - a;
		int yy = y - b;
		int zz = z - c;

		if((xx + yy + zz) || (xx % 20 != 0 || yy % 20 != 0 || zz % 20)) cout << -1 << endl;
		else
		{
			int p[3] = {xx, yy, zz};
			sort(p, p + 3);
			xx = p[0] / 20, yy = p[1] / 20, zz = p[2] / 20;
			int ans = 0;

			if((xx % 3 + 3) % 3 != (yy % 3 + 3) % 3 || (xx % 3 + 3) % 3 != (zz % 3 + 3) % 3)
	        {
	            cout<<-1<<endl;
	            continue;
	        }

			// cout << xx << " " << yy << " " << zz << endl;
			if(yy > 0)
			{
				ans += yy;
				xx += 2 * yy;
				zz -= yy;
				yy = 0;

				ans += zz / 3 * 2;

				/*
				while(yy > 0)
				{
					xx += 2;
					yy -= 1;
					zz -= 1;
					ans ++;
				}

				while(xx < 0)
				{
					xx += 3;
					zz -= 3;
					ans += 2;
				}
				*/
			}
			else if(yy < 0)
			{
				ans += abs(yy);
				xx += abs(yy);
				zz -= 2 * abs(yy);
				yy = 0;

				ans += zz / 3 * 2;
				/*
				while(yy < 0)
				{
					xx += 1;
					yy += 1;
					zz -= 2;
					ans ++;
				}

				while(xx < 0)
				{
					xx += 3;
					zz -= 3;
					ans += 2;
				}
				*/
			}
			else
			{
				ans += zz / 3 * 2;
				// while(xx < 0)
				// {
				// 	xx += 3;
				// 	zz -= 3;
				// 	ans += 2;
				// }
			}
			cout << ans << endl;
		}
	}
	
	return 0;
}

7-2 拼题A打卡奖励

分数 25
7-2 拼题A打卡奖励

01背包的变形,在面临超时的情况下,明智的选择另一种作为限制

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <cstring>
#include <cmath>
#include <stack>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define sc(a) scanf("%lld",&a)
#define pf(a) printf("%d",a) 
#define endl "\n"
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define LL long long 
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define x first
#define y second
const double eps = 1e-6;
const int mod = 998244353;
const int MOD = 1e9 + 7;
const int N = 1e3 + 10, M = 3e4 + 10;
int n, m;
int w[N], v[N];
int f[M];
signed main()
{
	fast;
	cin >> n >> m;
	for(int i=1; i<=n; i++) cin >> v[i];//时间
	for(int i=1; i<=n; i++) cin >> w[i];//金币
	memset(f, 0x3f, sizeof f);
	f[0] = 0;
	for(int i=1; i<=n; i++)
		for(int j=30000; j>=w[i]; j--)
		{
			f[j] = min(f[j], f[j - w[i]] + v[i]);
		}

	for(int i=30000; i>=0; i--)
	{
		if(f[i] <= m) 
		{
			cout << i << endl;
			break;
		}
	}
	return 0;
}

7-3 快递装箱

分数 25
7-3 快递装箱

大模拟,没拿到满分,就十六分,不想改了,累了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <cstring>
#include <cmath>
#include <stack>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fast ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define sc(a) scanf("%lld",&a)
#define pf(a) printf("%d",a) 
#define endl "\n"
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define LL long long 
#define lowbit(p) p&(-p)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define x first
#define y second
const double eps = 1e-6;
const int mod = 998244353;
const int MOD = 1e9 + 7;
const int N = 1e4 + 10;
// deque<int> a, b, c, d;
queue<PII> a, b, c;
deque<PII> d1, d;
int n, m, w1, w2, wm;
int f1[N], f2[N];
int res1, res2;

signed main()
{
	// fast;
	cin >> n >> wm >> w1 >> w2;
	PII p;
	for(int i=1; i<=n; i++)
	{
	    while(d.size() >= 2) 
	    {
	        p = d.back();
	        d.pop_back();
	        d1.push_back(p);
	    }
	    
		if(c.size())
		{
			p = c.front();
			c.pop();
			if(!d.size()) 
			{
				d.push_front(p);
				f1[p.y] = 1;
			}
			else if(d.size())
			{
				PII q = d.front();
				d.pop_front();
				if(p.x + q.x <= wm && !f1[p.y]) d.push_front({p.x + q.x, q.y});
				else if((p.x + q.x > wm && !f1[p.y]) || f1[p.y])
				{
					if(q.x > w2) res2 ++;
					else d.push_back(q);
					d.push_front(p);
					f1[p.y] = 1;
				}
			}	
		}
		// else if(d.size() && i == n)
		// {
		// 	PII q = d.front();
		// 	d.pop_front();
		// 	if(q.x > w2) res2 ++;
		// 	else d1.push_back(q);
		// }

		if(b.size())
		{
			p = b.front();
			b.pop();
			if(p.x > w2) res1 ++;
			else c.push(p);
		}

		if(a.size())
		{
			p = a.front();
			a.pop();
			if(p.x > w1) f1[p.y] = 1;
			b.push(p);
		}
		
		cin >> m;

		if(d1.size()) 
		{
			p = d1.front();
			d1.pop_front();
			if(p.x + m <= wm) 
			{
				a.push({m + p.x, i});
				f1[i] = 1;
			}
			else
			{
				d1.push_front(p);
				a.push({m, i});
			}
		}
		else a.push({m, i});
		
// 		cout << "di.size(): " << d1.size() << endl;
	} 
	
	if(d.size())
	{
		p = d.front();
		d.pop_front();
		if(p.x > w2) res2 ++;
		else d.push_front(p);
	}
	
	vector<int> v;
	
	while(a.size())
	{
	    p = a.front();
	    v.push_back(p.x);
	    a.pop();
	   // cout << "!!!" << endl;
	}
    
    while(b.size())
	{
	    p = b.front();
	    v.push_back(p.x);
	    b.pop();
	   // cout << "!!!" << endl;
	}
	while(c.size())
	{
	    p = c.front();
	    v.push_back(p.x);
	    c.pop();
	   // cout << "!!!" << endl;
	}
	while(d.size())
	{
	    p = d.front();
	    v.push_back(p.x);
	    d.pop_front();
	   // cout << "!!!" << endl;
	}
	while(d1.size())
	{
	    p = d1.front();
	    v.push_back(p.x);
	    d1.pop_front();
	   // cout << "!!!" << endl;
	}
	
	sort(v.begin(), v.end());
	
	cout << res1 << " " << res2 << " " << v.size() << endl;
	
	if(v.size() == 0) puts("None");
	else
	{
		for(int i=0; i<v.size(); i++)
		{
		    cout << v[i];
		    if(i == v.size() - 1) cout << endl;
		    else cout << " ";
		}
	}
	
	return 0;
}

7-4 塔防游戏

分数 30
7-4 塔防游戏

头一次写二位最短路文章来源地址https://www.toymoban.com/news/detail-576420.html

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define PII pair<int, int>
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define PIII pair<int, PII>
#define x first
#define y second
const int N = 110;
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};//方向
struct node
{
	int x, y, z;
};
int dist[N][N];
int f[110][110];
PII path[N][N];//记录僵尸路径 
bool vis[N][N];
vector<node> v;//记录僵尸 
int cnt[N][N];//记录走过的步数
vector<PII> p[4 * N];//记录每个僵尸的路线 
int num[4 * N];//僵尸人数 
map<PII, int> mp;
int now[N * 4];
int idx = 1;
int n, m, T;

int get(PII xx)
{
    if(mp[xx] == 0) mp[xx] = idx++ ;//因为前面判断就是用的等于0,所以下标要从1开始 
    return mp[xx];
}
///*
void dij(PII u)
{
	memset(dist, 0x3f, sizeof dist);
	priority_queue<PIII, vector<PIII>, greater<PIII>> q;
	
	dist[u.x][u.y] = 0;
	q.push({0, u});
	while(q.size())
	{
		auto t = q.top();
		q.pop();
		
		if(vis[t.y.x][t.y.y]) continue;
		
		vis[t.y.x][t.y.y] = 1;
		
		auto tt = t.y;
		for(int i=0; i<4; i++)
		{
			int xx = tt.x + dx[i];
			int yy = tt.y + dy[i];
			
			if(xx > n || xx < 1 || yy > m || yy < 1) continue;
			
			if(dist[xx][yy] > dist[tt.x][tt.y] + f[xx][yy])
			{
				dist[xx][yy] = dist[tt.x][tt.y] + f[xx][yy];
				cnt[xx][yy] = cnt[tt.x][tt.y] + 1;
				path[xx][yy] = tt;
				q.push({dist[xx][yy], {xx, yy}});
			}
			else if(dist[xx][yy] == dist[tt.x][tt.y] + f[xx][yy])
			{
				if(cnt[xx][yy] > cnt[tt.x][tt.y] + 1)
				{
					path[xx][yy] = tt;
					q.push({dist[xx][yy], {xx, yy}});
				}
			}
		}
	}
	
}
//*/
signed main()
{
	fast;
	cin >> n >> m >> T;
	PII start;
	for(int i=0; i<=n+1; i++)
	{
		for(int j=0; j<=m+1; j++)
		{
			cin >> f[i][j];
			if(i == 0 || j == 0 || i == n + 1 || j == m + 1)
			{
				if((i == 0 && j == 0) || (i == 0 && j == m+1) || (i == n+1 && j == 0) || (i == n+1 && j == m+1)) continue;
				else v.push_back({i, j, f[i][j]});
			} 
			
			if(f[i][j] < 0) start = {i, j};
		}
	}
//	/*
	dij(start);
//	/*
	for(auto i : v)
	{
		int id = get({i.x, i.y});
		num[id] = i.z;
		PII kk;
	    for(int j = 0 ; j < 4 ; j++) //由僵尸边上走到地图里面去
            if(i.x + dx[j] >= 1 && i.x + dx[j] <= n && i.y + dy[j] >= 1 && i.y + dy[j] <= m)
			{
                kk.x = i.x + dx[j] , kk.y = i.y  + dy[j];
                break ;
			}
			
		while(1)
		{
            p[id].push_back(kk);
            if(kk.x == start.x && kk.y == start.y) break;//找到大本营的位置了
            kk = path[kk.x][kk.y];
        }
    }
    
//    /*
    for(int t = 1; t <= T; t ++)
    {
//    	memcpy()
    	set<PII> s;
    	for(auto i : v)
    	{
    		int id = get({i.x, i.y});
    		
    		if(num[id] == 0) continue;
    		
    		int xx = p[id][now[id]].x;
    		int yy = p[id][now[id]].y;
    		
    		if(f[xx][yy] > 0 && (xx != start.x || yy != start.y)) s.insert({xx, yy});
    		else if(f[xx][yy] < 0 && (xx == start.x && yy == start.y)) s.insert({xx, yy});
		}
		
		for(auto i : v)
		{
			int id = get({i.x, i.y});
			
			if(num[id] == 0) continue;
			
            int xx = p[id][now[id]].x;
    		int yy = p[id][now[id]].y;
    		
    		if(s.count({xx, yy}) == 0) now[id] ++;//set中记录了哪些是炮台,所以不需要滚动数组优化 
    		else
    		{
    			if(f[xx][yy] > 0) f[xx][yy] --;//减到0就没了,不减了,根据输出来搞得 
    			else if(f[xx][yy] < 0) f[xx][yy]++;
    			num[id] --;
			}
			
		}
		
		if(f[start.x][start.y] == 0) break;
	}
//	*/
	 for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
        	cout << f[i][j];
            if(j < m) cout << " ";
            else cout << endl;
		}
            
    if(f[start.x][start.y] == 0) cout << "Game Over" << endl;
	return 0;
}

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

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

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

相关文章

  • 【Java】2021 RoboCom 机器人开发者大赛-高职组(复赛)题解

    号称具有人工智能的机器人,至少应该能分辨出新人和老朋友,所以打招呼的时候应该能有所区别。本题就请你为这个人工智能机器人实现这个功能:当它遇到陌生人的时候,会说:“Hello X, how are you?”其中 X 是这个人的称呼;而当它再次遇到这个人的时候,会说:“Hi X!

    2024年02月12日
    浏览(30)
  • 【Java】2021 RoboCom 机器人开发者大赛-高职组(初赛)题解

    机器人小白要来 RoboCom 参赛了,在赛场中遇到人要打个招呼。请你帮它设置好打招呼的这句话:“ni ye lai can jia RoboCom a?”。 输入格式: 本题没有输入。 输出格式: 在一行中输出 ni ye lai can jia RoboCom a? 。 输入样例: 输出样例: Solution: 人脸识别是基于人的脸部特征信息进

    2024年02月12日
    浏览(31)
  • 2022 RoboCom 世界机器人开发者大赛-高职组(省赛)

    RC-v1 您好呀 分数 5 本届比赛的主题是“智能照护”,那么就请你首先为智能照护机器人写一个最简单的问候程序 —— 无论遇见谁,首先说一句“您好呀~”。 输入格式: 本题没有输入 输出格式: 在一行中输出问候语的汉语拼音  Nin Hao Ya ~ 。 输入样例: 输出样例:  提交

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

    RC-u1 智能红绿灯 题意:为绿灯时,点击按钮后15s后转为红色持续30s,为红灯时再点击按钮则延长15s并只能延长一次,其它操作无效。 题解:模拟题,需要注意的是按下按钮后15s转为红灯后的点亮时间是闭区间,如第1s按下,红灯显示区间为[16, 45],在这个区间再次点击按钮时

    2024年02月13日
    浏览(40)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)

    1、不要浪费金币 哲哲最近在玩一个游戏,击杀怪物能获得金币 —— 这里记击杀第 i 个怪物获得的金币数量为 P i ​ 。 然而这个游戏允许拥有的金币数量是有上限的,当超过时,超过上限的部分就会被系统光明正大地吃掉,哲哲就拿不到了。 为了不浪费金币,哲哲决定,当

    2024年02月03日
    浏览(42)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)

    1、智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的: 路的两旁设置了一个按钮,老年人希望通行马路时会按下按钮; 在没有人按按钮的时候,红绿灯一直为绿灯; 当红绿灯为绿灯时

    2024年02月17日
    浏览(35)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-- 第三题 跑团机器人 (已完结)

    其它题目 RC-u3 跑团机器人 在桌面角色扮演游戏(TRPG,俗称“跑团”)中,玩家需要掷出若干个骰子,根据掷出的结果推进游戏进度。在线上同样可以跑团,方法是由玩家们向机器人发出指令,由机器人随机产生每个需要掷出的骰子的结果。 玩家向机器人发出的指令是一个仅

    2024年02月16日
    浏览(35)
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)R4,R5题解

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

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

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

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

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

    2024年02月16日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包