2024睿抗机器人编程技能大赛(本科组)感受

RC-U1

1.题目大意:有一个活动就是每周除星期四外只要气温不低于35℃就可以免费领取雪糕,给你两个数n,w(其中n代表天数,n∈[1,50];w代表第一天是星期几,w∈[1,7]),然后再给你n个数tn(ti∈(-273,60]),让你计算能领取雪糕的天数和虽然气温不低于35℃但是因为当天是星期四不能领雪糕的天数。

2.解题思路:模拟,没啥好说的

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,w;
	scanf("%d%d",&n,&w);
	int a=0,b=0;
	for(int i=w;i<w+n;i++)
	{
		int x;
		scanf("%d",&x);
		if(x>=35)
		{
			if(i%7==4) b++;
			else a++;
		}
	}
	printf("%d %d",a,b);
	return 0; 
}

RC-U2

1.题目大意:给你一张表,一个名次对应一个分数(表的具体内容见代码,其中16~20名0分),总分=排名分数+杀敌分数。然后给你T组测试数据,每组有20行,分别是20名玩家的排名和杀敌个数,对于每组测试样例让你输出20行(按照序号从1~20输出)。

2.大致思路:还是模拟,还是没啥好说的

#include<bits/stdc++.h>
using namespace std;
const int N=25;
int score[N];
int get_score(int p,int k)
{
	int res=k;
	if(p==1) res+=12;
	else if(p==2) res+=9;
	else if(p==3) res+=7;
	else if(p==4) res+=5;
	else if(p==5) res+=4;
	else if(p==6||p==7) res+=3;
	else if(8<=p&&p<=10) res+=2;
	else if(11<=p&&p<=15) res++;
	return res;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		for(int i=1;i<=20;i++)
		{
			int p,k;
			scanf("%d%d",&p,&k);
			score[i]+=get_score(p,k);
		}
	}
	for(int i=1;i<=20;i++)
	{
		printf("%d %d",i,score[i]);
		if(i<20) puts("");
	}
	return 0;
}

RC-U3

1.题目大意:给你一张图,已知图中有感觉温暖的水豚('w')、感觉寒冷的水豚(’c‘)、暖气炉('m')以及空白区域('.')。这张图可能不合法,并且如果不合法,那个不合法的肯定是一只温暖的水豚,然后让你求使得这张图从不合法变为合法的暖气片的全部可能区域,并按照行从小到大排序输出(如果行号相同,按照列号从小到大排序输出)。如果不存在,输出“Too Cold!”(不带引号)。

2.大致思路:还是模拟,不过这道题有坑点,就是当这张图合法时,即不存在使得这张图从不合法变为合法的暖气片,另外还需要注意当扫描到空白区域时,还要对空白区域周围进行扫描,如果周围不存在感觉寒冷的水豚,答案合法,否则答案不合法。最后用一个小根堆存储所有合法答案,不断取出堆顶元素,直到堆为空。

#include<bits/stdc++.h>
using namespace std;
using PII=pair<int,int>;
const int N=1010;
int n,m;
char g[N][N];
vector<PII> warming,heat_waves;
PII illegal;
bool check(int x,int y)
{
	for(int i=x-1;i<=x+1;i++)
		for(int j=y-1;j<=y+1;j++)
		{
			if(i<1||i>n||j<1||j>m) continue;
			if(g[i][j]=='m') return true;
		}
	return false;
}
bool check1(int x,int y)
{
	for(int i=x-1;i<=x+1;i++)
		for(int j=y-1;j<=y+1;j++)
		{
			if(i<1||i>n||j<1||j>m) continue;
			if(g[i][j]=='c') return false;
		}
	return true;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",g[i]+1);
		for(int j=1;j<=m;j++)
		{
			char c=g[i][j];
			if(c=='w') warming.push_back({i,j});
			else heat_waves.push_back({i,j});
		}
	}
    bool is_legal=true;
	for(auto item:warming)
		if(!check(item.first,item.second))
		{
			illegal=make_pair(item.first,item.second);
            is_legal=false;
			break;
		}
    if(is_legal) return !puts("Too cold!");
	priority_queue<PII,vector<PII>,greater<PII>> heap;
	int x=illegal.first,y=illegal.second;
	for(int i=x-1;i<=x+1;i++)
		for(int j=y-1;j<=y+1;j++)
		{
			if(i<1||i>n||j<1||j>m) continue;
			//printf("g[%d][%d]=%c\n",i,j,g[i][j]);
			if(g[i][j]=='.')
				if(check1(i,j)) heap.push({i,j});
		}
	if(!heap.size()) puts("Too cold!");
	while(heap.size())
	{
		auto t=heap.top();
		heap.pop();
		printf("%d %d\n",t.first,t.second);
	}
	return 0;
}

4.RC-U4

题目大意:给你章鱼图的概念,就是图中只有一个环的大于两个点的无向连通图,然后给你几张无向图,问你是否只有一个章鱼子图。如果是,输出"Yes"(不带引号,下同)和环中包含点的个数,否则输出“No”和章鱼子图的个数。

这道题我也不会,希望看到的大佬给我指点一下555555......

5.RC-U5

题目大意:给你几组测试样例,然后给你每份工作需要的时间、最晚完成的时间和报酬,然后问你这个人获得的最大报酬是多少。

错误代码:

(贪心,按照报酬大小从大到小排列,相同的话按照最晚完成的时间从早到晚排列,如果还相同按照完成用时从短到长排列,21pts,测试点4和6答案错误)

#include<bits/stdc++.h>
using namespace std;
const int N=5010;
struct Work
{
	int t,d,p;
	bool operator<(const Work &w)const
	{
		if(p!=w.p) return p>w.p;
		if(d!=w.d) return d<w.d;
		return t<w.t;
	}
}works[N];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++)
		{
			int t,d,p;
			scanf("%d%d%d",&t,&d,&p);
			works[i]={t,d,p};
		}
		sort(works,works+n);
		int ans=0;
		for(int i=0;i<n;i++)
		{
			int tmp=0,time_elapsed=0;
			for(int j=i;j<n;j++)
			{
				if(time_elapsed+works[j].t<=works[j].d)
				{
					time_elapsed+=works[j].t;
					tmp+=works[j].p;
					//cout<<"Elapsed time:"<<time_elapsed<<endl;
					//cout<<"Earned money:"<<tmp<<endl;
				}
			}
			ans=max(ans,tmp);
		}
		printf("%d\n",ans);
	}
	return 0;
}

(01背包变形,22pts,测试点6答案错误)

#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int t[N],d[N],p[N];
int f[N];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		memset(f,0,sizeof f);
		int n;
		scanf("%d",&n);
		for(int i=0;i<n;i++) scanf("%d%d%d",&t[i],&d[i],&p[i]);
		for(int i=0;i<n;i++)
			for(int j=d[i];j>=t[i];j--)
				f[j]=max(f[j],f[j-t[i]]+p[i]);
		int ans=0;
		//for(int i=0;i<=sum;i++) printf("f[%d] = %d\n",i,f[i]);
		for(int i=0;i<N;i++) ans=max(ans,f[i]);
		printf("%d\n",ans);
	}
	return 0;
}

希望看到的大佬能帮我看看这两个代码都错在哪里了,谢谢。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值