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

1、不要浪费金币

题目分析:

没啥好分析的,从前往后遍历就行

 C++代码如下:

#include<iostream>
using namespace std;
const int N=1010;
int a[N]; 
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];int sum=0,cnt=0;for(int i=1;i<=n;i++){if(sum+a[i]>m){//如果加上当前的金币数后sum>m,则需要去消费一次cnt++;//消费次数+1sum=0;//sum重置为0}sum+=a[i];//加上当前的金币数}cout<<cnt<<endl;return 0;
}

2、智能服药助手

题目分析 :

本题保证按照时间递增的顺序给出每个时间的服用药物计划,所以我们从前往后做就可以,不用考虑时间问题

用一个数组last[],last[i]记录上一次服用药物i的时间

对于每个时间点,对当前时间点服用的药物进行一次时间判断即可

C++代码如下:

#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int last[N],b[N];//last[i]表示上一次服用药物i的时间
int n,m;
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>b[i];//第i种药物服用的间隔时间为b[i]memset(last,-1,sizeof last);//初始化为-1while(m--){int t,k;cin>>t>>k;//在t时间服用k种药物while(k--){int x;cin>>x;//1、间隔时间为0  2、未服用过该药物  3、间隔时间足够了,都可以服用该药物if(b[x]==-1||last[x]==-1||t-last[x]>=b[x])last[x]=t;//否则不可服用else printf("Don't take %d at %d!\n",x,t);}}return 0;
}

 3、跑团机器人

题目分析:

一个字符串模拟题,详情看注释

 C++代码如下:

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
map<int,int> cnt;//cnt[i]存储第i种骰子被掷的总数
int maxx,minn;//存储点数的最大最小值
void solve(string s){int i=0,n=s.size();int flag=1;//flag为当前指令的正负号,1为正,-1为负while(i<n){int pre=0,last=0;//读取数字字符,存在pre中,isdigit(c)判断c是否是数字字符,是就返回true while(i<n&&isdigit(s[i]))pre=pre*10+s[i]-'0',i++;//如果数字后面是d,说明是这一个指令if(s[i]=='d'){if(pre==0)pre=1;//d前面没有数字时,默认为1 i++;//读取d后面的数字,存在last中while(i<n&&isdigit(s[i]))last=last*10+s[i]-'0',i++;//last面骰子的掷数增加precnt[last]+=pre;if(flag==1){//pre前面符号为正时minn+=pre;//(pre*1最小)maxx+=pre*last;//(pre*last最大) }else{//pre前面符号为负minn-=last*pre;maxx-=pre;}}else{//读取完pre后停止在'+'或'-'或越界,说明是一个常量,更新maxx和minnmaxx+=flag*pre;minn+=flag*pre;}if(i<n-1){//如果i停在'+'或者'-',则更新flag,flag作为下一个数字前的符号 if(s[i]=='+')flag=1;else if(s[i]=='-')flag=-1;i++;}}
}
int main(){string s;cin>>s;solve(s);for(auto t:cnt)cout<<t.first<<" "<<t.second<<endl;cout<<minn<<" "<<maxx<<endl;return 0;
}

4、攻略分队

题目分析:

将6支队伍(可能不足六只)按要求分成两组,dfs深搜出所有可行的方案,然后用结构体存储起来,写一个cmp函数用于按照题意进行排序,最后输出所有方案种的第一个就可,不存在就输出GG

C++代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10;
int a[N][3],b[N];
int cnt;
struct node{int mt[2],zh[2],gb[2];//主坦克,指挥,工兵//mt[0],zh[0],gb[0]表示第1组的信息,mt[1],zh[1],gb[1]表示第2组的信息,int sum[2];//sum[0]:讨伐欧文的人数  sum[1]:讨伐亚特的人数string ch[2];//每一组的队伍编号用字符串记录,方便排序和输出
}ans[1200],s;
bool cmp(node x,node y){int t1=(x.zh[0]&&x.zh[1]&&x.gb[1]&&x.gb[0]);//方案x是否满足条件1int t2=(y.zh[0]&&y.zh[1]&&y.gb[1]&&y.gb[0]);//方案y是否满足条件1if(t1!=t2)return t1>t2;if(!t1){//条件1无法满足t1=(x.zh[0]&&x.zh[1]);//方案x是否满足条件2t2=(y.zh[0]&&y.zh[1]);//方案y是否满足条件2if(t1!=t2)return t1>t2;}//二者都满足条件1或两者都满足条件2或两者都不满足条件2,然后判断条件3if(abs(x.sum[0]-x.sum[1])!=abs(y.sum[0]-y.sum[1]))return abs(x.sum[0]-x.sum[1])<abs(y.sum[0]-y.sum[1]);//满足条件3的方案不唯一,然后判断条件4t1=(x.sum[0]>x.sum[1]);t2=(y.sum[0]>y.sum[1]);if(t1!=t2)return t1>t2;//满足条件4的方案不唯一,然后判断条件5return x.ch[0]<y.ch[0];
}
void dfs(int x,node y){if(x==7){//六支队伍都搜完了if(y.mt[0]>0&&y.mt[1]>0)//判断一下是否每组都有一个mt(主坦克)ans[cnt]=y,cnt++;//n记录满足条件的方案数return;}if(!b[x]){//如果第x支队伍不存在,则直接看下一个队伍dfs(x+1,y);return;}for(int i=0;i<=1;i++){//考虑将第x支队伍给第1组还是第2组node t=y;t.sum[i]+=b[x];//人数加上第x支队伍的人数t.mt[i]+=a[x][0];//mt数量加上第x支队伍的mt数t.gb[i]+=a[x][1];//gb数量加上第x支队伍的gb数t.zh[i]+=a[x][2];//zh数量加上第x支队伍的zh数t.ch[i]+=char(x+'0');//记录队伍编号t.ch[i]+=" ";//加上空格,方便输出dfs(x+1,t);}
}
int main(){for(int i=1;i<=6;i++)scanf("%d",&b[i]);for(int i=1;i<=6;i++){string ch;cin>>ch;//a[i][0],a[i][1],a[i][2]分别记录第i支队伍的mt数,gb数,zh数for(int j=0;j<3;j++)a[i][j]=(ch[j]-'0');}dfs(1,s);if(cnt){sort(ans,ans+cnt,cmp);//给所有方案排序string res1,res2;res1=ans[0].ch[0],res2=ans[0].ch[1];//不能有多余的空格,所以都要删除最后一个空格,然后再输出res1.erase(res1.end()-1),res2.erase(res2.end()-1);cout<<res1<<"\n"<<res2;}else printf("GG\n");return 0;
}

5、树与二分图

题目分析:

 给定一颗n个点n-1条边的树,问选择本没有边相连的两个点,使得将这两个点相连能够构成二分图,一共有多少种选择方案

判断一个图是否是二分图可以用染色法:一共有两种颜色,每个点和它的相邻节点颜色不相同,看是否可以染色成功,如果可以,则是二分图,否则不是

1、暴力做法可以骗到19分

枚举每两个点,如果这两个点之间没有边,则尝试往这两条边之间连一条边,如果连边之后是一个二分图的话,答案就加一

 暴力C++代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
vector<int> s[N];
typedef pair<int,int> PII;
map<PII,int> mp;
int color[N];
int dfs(int u,int c){//染色法判定二分图,颜色编号为1和2color[u]=c;for(int i=0;i<s[u].size();i++){//遍历u的所有邻点int j=s[u][i];if(!color[j]){//如果未被染色且染色失败,则返回falseif(!dfs(j,3-c))return false;}else if(color[j]==c)//如果已经被染色但是颜色和u相同,也返回falsereturn false;}return true;//染色成功,返回true
}
int main(){int n;cin>>n;for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;s[a].push_back(b);s[b].push_back(a);mp[{a,b}]++;mp[{b,a}]++;}int sum=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(!mp[{i,j}]){//如果树中没有这条边,则加上这条边判断是否是二分图memset(color,0,sizeof color);s[i].push_back(j);s[j].push_back(i);if(dfs(i,1))sum++;s[i].pop_back();s[j].pop_back();}cout<<sum<<endl;return 0;
}

二分图:图中不含有奇数环

正解:由于给定的树是一颗n个点n-1条边的树,所以一定是一个二分图,因为没有环

所以可以先给树中所有节点染色,然后算出两种颜色各含有多少节点

颜色编号为1的节点个数为x

颜色编号为2的节点个数为y,y=n-x

如果让所有颜色不同的点之间都有边也不会影响该二分图,所以一共有x*y种情况,但由于树中一开始就有n-1条边,所以二者之差就是答案,即x*y-(n-1)

 C++代码如下:

#include<iostream>
#include<vector>
using namespace std;
const int N=1000010;
typedef long long LL;
vector<int> s[N];
int color[N];//颜色编号为1和2 
void dfs(int u,int c){color[u]=c;for(int i=0;i<s[u].size();i++){int j=s[u][i];if(!color[j])//如果未被染色就染色 dfs(j,3-c);}
}
int main(){int n,x=0,y=0;//x存储颜色为1的节点数,y存储颜色为2的节点数 cin>>n;for(int i=0;i<n-1;i++){int a,b;cin>>a>>b;//添加一条无向边 s[a].push_back(b);s[b].push_back(a);}dfs(1,1);//染色,该题一定会染色成功 for(int i=1;i<=n;i++)if(color[i]==1)x++;y=n-x;cout<<(LL)x*y-(n-1)<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶段三:项目开发---大数据开发运行环境搭建:任务6:安装配置HBase

任务描述 知识点&#xff1a;安装配置HBase 重 点&#xff1a; 安装配置HBase 难 点&#xff1a;无 内 容&#xff1a; 本阶段任务是安装配置HBase&#xff0c;实时飞行数据是保存在HBase中的&#xff0c;因为HBase具有高效的读写能力&#xff0c;在当前项目中我们是…

矢量绘图设计Sketch中文 Sketch直装安装包

Sketch是一款专为UI设计师和UX专家打造的矢量图形设计软件&#xff0c;以其简洁的界面、强大的功能和高效的协作能力而闻名。Sketch支持快速创建高质量的UI界面、图标、图形和插画&#xff0c;其矢量绘图工具让设计细节更加精准。同时&#xff0c;Sketch内置丰富的插件和组件库…

基于vue的3D高德地图的引入

在引入高德地图的时候需要先注册一个账号 登录下面的网站 账号认证 | 高德控制台 (amap.com) 打开首页应用管理&#xff0c;我的应用 创建新的应用 根据自己的需求进行选择 创建完成之后&#xff0c;点击添加key 不同的服务平台对应不同的可使用服务&#xff0c;选择自己适…

LeetCode刷题之HOT100之完全平方数

2024 7/7 转眼间就到周日啦&#xff01;昨天下午开组会&#xff0c;开了三个半小时。如坐针毡&#xff0c;会后跑了个步、洗了个澡、洗了衣服、躺床上看了会《罪与罚》&#xff0c;睡着了。早上起来&#xff0c;去拿我昨晚充电的车&#xff0c;当我看到车没有停在昨天的位置&am…

《算法笔记》总结No.3——排序

基础算法之一&#xff0c;相当重要。在普通的机试中如果没有数据类型和时空限制&#xff0c;基本上选择自己最熟悉的就好。本篇只总结选择排序和插入排序&#xff0c;侧重应用&#xff0c;408中要求的种类更加繁多&#xff0c;此处先不扩展难度~总结最常用的两种排序。 一.选择…

14-24 剑和侠客 – 预训练模型三部曲1 - 文本

在这个三部曲中&#xff0c;我们旨在从三个部分深入研究预训练模型&#xff1a;文本、图像和机器人。 我们旨在探索它们的概念、出现以及这些模型的工作原理。还将研究预训练模型的不同架构和类型。 探索哪些是最强大的&#xff0c;以及预训练模型和 Transformers 是否是 LLM…

常用SQL语句(基础篇)

前言 查询的sql的结构是 select...from...where...group by...having...order by...limit... 写查询sql的时候需要按照如下顺序写 from&#xff0c;where&#xff08;and&#xff0c;or&#xff0c;&#xff01;&#xff09;&#xff0c;group by&#xff0c;select&#xf…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《计及电-热-氢负荷与动态重构的主动配电网优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Simulated Annealing

模拟退火最大值算法&#xff1a; 初始化起始解 x 0 x_0 x0​ 、温度 t 0 t_0 t0​ 以及迭代次数 steps&#xff0c;计算初始值 y 0 y_0 y0​扰动产生新解 x 1 x_1 x1​, 计算对应函数值 y 1 y_1 y1​依据 Δ y y 1 − y 0 \Delta y y_1 - y_0 Δyy1​−y0​ 决策是否接…

缓存-分布式锁-原理和基本使用

分布式锁原理和使用 自旋 public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {Boolean b redisTemplate.opsForValue().setIfAbsent(Lock, Lock, Duration.ofMinutes(1));if (!b) {int i 10;while (i > 0) {Object result redisTe…

[c++] 可变参数模版

前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge&#x1f60e; 前言&#x1f64c;Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…

rkmpp移植与测试

一、mpp交叉编译 MPP(Media Process Platform )是Rockchip提供的一款硬件编解码媒体处理软件平台&#xff0c;适用于Rockchip芯片系列。它屏蔽了有关芯片的复杂底层处理&#xff0c;屏蔽了不同芯片的差异&#xff0c;为使用者提供了一组MPI统一接口。如果想达到最好的效果&…

Linux字符设备驱动

一、字符设备驱动结构 1. cdev结构体 在Linux内核中&#xff0c;使用cdev结构体来描述一个字符设备 struct cdev {struct kobject kobj; //内嵌kobject对象struct module *owner; //所属的模块const struct file_operations *ops; //该设备的文件操作结构体struct list_head…

SpringBoot新手快速入门系列教程六:基于MyBatis的一个简单Mysql读写例子

MyBatis和JPA是两种不同的Java持久层框架&#xff0c;各有其优缺点。以下是它们的比较&#xff1a; MyBatis 优点 灵活性高&#xff1a;MyBatis允许手动编写SQL查询&#xff0c;可以完全控制SQL执行过程&#xff0c;非常适合复杂的查询和需要高度优化的查询。SQL分离&#x…

用proteus软件如何设计一个基于8086微处理器的简易温度计?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

#数据结构 顺序表

线性表 顺序表 每种结构都有它存在意义 线性表的顺序存储实现指的是用一组连续的存储单元存储线性表的数据元素。 概念 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性表&#xff0c;一般情况下采用数组存储。在数组上完成数据的增查改删。 逻辑结构&#…

IDEA配Git

目录 前言 1.创建Git仓库&#xff0c;获得可提交渠道 2.选择本地提交的项目名 3.配置远程仓库的地址 4.新增远程仓库地址 5.开始进行commit操作 6.push由于邮箱问题被拒绝的解决方法&#xff1a; 后记 前言 以下操作都是基于你已经下载了Git的前提下进行的&#xff0c…

CSRF靶场通关合集

目录 前言 CSRF漏洞总结 1.PiKachu靶场 1.1CSRF(get) 1.2 CSRF(post)请求 1.3 CSRF Token 2.DVWA靶场 难度低 难度中 难度高 前言 最近系统的将从web渗透到内网渗透的知识点做一个回顾,同时结合一些实战的案例来演示,下面是对刚开始学习时对靶场的一个总结. CSRF漏洞…

OPENCV(图像入门笔记)

使用OpenCV读取图像 使用cv.imread()函数读取图像。 第一个参数为图像名称 第二个参数是一个标志&#xff0c;它指定了读取图像的方式。分别有三种 cv.IMREAD_COLOR&#xff1a; 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE&#xff1a;以…