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++;//消费次数+1
			sum=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);//初始化为-1
    while(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面骰子的掷数增加pre
            cnt[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和minn
            maxx+=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是否满足条件1
    int t2=(y.zh[0]&&y.zh[1]&&y.gb[1]&&y.gb[0]);//方案y是否满足条件1
    if(t1!=t2)return t1>t2;
    if(!t1){//条件1无法满足
        t1=(x.zh[0]&&x.zh[1]);//方案x是否满足条件2
        t2=(y.zh[0]&&y.zh[1]);//方案y是否满足条件2
        if(t1!=t2)return t1>t2;
    }
    //二者都满足条件1或两者都满足条件2或两者都不满足条件2,然后判断条件3
    if(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的方案不唯一,然后判断条件4
    t1=(x.sum[0]>x.sum[1]);
    t2=(y.sum[0]>y.sum[1]);
    if(t1!=t2)return t1>t2;
    //满足条件4的方案不唯一,然后判断条件5
    return 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和2
    color[u]=c;
    for(int i=0;i<s[u].size();i++){//遍历u的所有邻点
        int j=s[u][i];
        if(!color[j]){//如果未被染色且染色失败,则返回false
            if(!dfs(j,3-c))return false;
        }else if(color[j]==c)//如果已经被染色但是颜色和u相同,也返回false
            return 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.mfbz.cn/a/782168.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络通信总体框架

目录 网络通信 一、网络通信的定义与基本原理 二、网络通信的组成要素 三、网络通信的应用与发展 网络体系结构 一、网络体系结构的定义与功能 二、OSI七层参考模型 三、网络体系结构的重要性 网络核心与边缘 一、网络核心 1. 定义与功能 2. 组成部分 3. 技术特点 …

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

01:spring

文章目录 一&#xff1a;常见面试题1&#xff1a;什么是Spring框架&#xff1f;1.1&#xff1a;spring官网中文1.2&#xff1a;spring官网英文 2&#xff1a;谈谈自己对于Spring IOC和AOP的理解2.1&#xff1a;IOCSpring Bean 的生命周期主要包括以下步骤&#xff1a; 2.2&…

国产化新标杆:TiDB 助力广发银行新一代总账系统投产上线

随着全球金融市场的快速发展和数字化转型的深入推进&#xff0c;金融科技已成为推动银行业创新的核心力量。特别是在当前复杂多变的经济环境下&#xff0c;银行业务的高效运作和风险管理能力显得尤为重要。总账系统作为银行会计信息系统的核心&#xff0c;承载着记录、处理和汇…

MySQL-行级锁(行锁、间隙锁、临键锁)

文章目录 1、介绍2、查看意向锁及行锁的加锁情况3、行锁的演示3.1、普通的select语句&#xff0c;执行时&#xff0c;不会加锁3.2、select * from stu where id 1 lock in share mode;3.3、共享锁与共享锁之间兼容。3.4、共享锁与排他锁之间互斥。3.5、排它锁与排他锁之间互斥3…

离线开发(VSCode、Chrome、Element)

一、VSCode 扩展 使用能联网的电脑 A&#xff0c;在VSCode官网下载安装包 使用能联网的电脑 A&#xff0c;从扩展下载vsix扩展文件 将VSCode安装包和vsix扩展文件通过手段&#xff08;u盘&#xff0c;刻盘 等&#xff09;导入到不能联网的离线电脑 B 中 在离线电脑 B 中安装…

计算机网络之无线局域网

1.无线局域网工作方式 工作方式&#xff1a;每台PC机上有一个无线收发机&#xff08;无线网卡&#xff09;&#xff0c; 它能够向网络上的其他PC机发送和接受无线电信号。 与有线以太网相似&#xff0c;无线局域网也是打包方式发送数据的。每块网卡都有一个永久的、唯一的ID号…

springboot配置扫描生效顺序

文章目录 举例分析项目结构如下noddles-user-backend 两个配置文件noddles-user-job 配置文件noddles-user-server 配置文件问题:server和Job启动时对应加载的数据库配置为哪一个&#xff1f; 总结 在微服务架构中&#xff0c;backend模块会定义一个基础的配置文件&#xff0c;…

java集合(2)

目录 一. Map接口下的实现类 1. HashMap 1.1 HashMap常用方法 2. TreeMap 2.1 TreeMap常用方法 3. Hashtable 3.1 Hashtable常用方法 4.Map集合的遍历 4.1 根据键找值 4.2 利用map中的entrySet()方法 二.Collections类 1.Collections类中的常用方法 三. 泛型 1. 为什…

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

14-43 剑和诗人17 - ActiveRAG之主动学习

​​​​​ 大型语言模型 (LLM) 的出现开启了对话式 AI 的新时代。这些模型可以生成非常像人类的文本&#xff0c;并且比以往更好地进行对话。然而&#xff0c;它们在仅依赖预训练知识方面仍然面临限制。为了提高推理能力和准确性&#xff0c;LLM 需要能够整合外部知识。 检索…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具&#xff0c;广泛用于处理视频和音频文件&#xff0c;包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层&#xff08;四层、七层 LVS/HAProxy/nginx&#xff09; -> Web缓存/应用层&#xff08;nginx、tomcat&#xff09; -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层&#xff08;r…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是一种常见的需求&#xff0c;这可以分成两种情况&#xff1a;一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用 git merge&#xff1b;另一种情…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布&#xff08;Canvas&#xff09; 2. 在画布上添加血底图像&#xff08;Image&#xff09;子物体 二、编辑血底UI 1. 将血底图片拖入源图像&#xff08;Source Image&#xff09;中 2. 点击设置为图片的原大小&#xff08;Set Native Size&#x…

算法重新刷题

基础算法 前缀和 一维前缀和 [USACO16JAN] Subsequences Summing to Sevens S - 洛谷 这一题主要是需要结合数学知识来求解&#xff0c; #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace std;con…