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

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

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

1.绿地围栏

2021 robocom 世界机器人开发者大赛-本科组(决赛),# RoboCom,算法,图论,c++

思路

模拟题目,主要是记住最后要把原点加入到目标点当中,不然最后一个测试点过不了。

代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
int n, l, now_l, x, y;
vector<pii> v;
void init(){
    cin >> n >> l;
    for (int i = 1; i <= n; ++i) {
        if (i & 1) cin>>y;
        else cin>>x;
        v.emplace_back(x,y);
    }
    v.emplace_back(0,0);        //这里很重要,因为要走回原点,这里如果不加上的话,最后一个测试点就会错。
}
void solve(){
    x = y = 0;now_l = l;
    cout<<x<<" "<<y<<"\n";
    for (pii &p : v) {
        while (x != p.first || y != p.second){
            if (x == p.first){  //如果当前是纵向
                if (y < p.second)       //向上
                    ++y;
                else                    //向下
                    --y;
            }
            else{               //如果当前是横向
                if (x < p.first)        //向右
                    ++x;
                else                    //向左
                    --x;
            }
            --now_l;
            if (now_l == 0){
                if (x != 0 || y != 0)
                    cout<<x<<" "<<y<<"\n";
                now_l = l;
            }
        }
    }
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    init();
    solve();
    return 0;
}

2.队列插入

2021 robocom 世界机器人开发者大赛-本科组(决赛),# RoboCom,算法,图论,c++

思路×

不太会,每理解大佬的思路,以后有机会补

代码×

3.账户安全预警

2021 robocom 世界机器人开发者大赛-本科组(决赛),# RoboCom,算法,图论,c++

输入样例1

24 3 4
daohaole@qq.com 218.109.231.189
1jiadelaolao@163.com 112.192.203.187
chenyuelaolao@zju.edu.cn 112.18.235.143
jiadelaolao@163.com 112.192.203.187
chenyuelaolao@zju.edu.cn 113.18.235.143
jiadelaolao@163.com 111.192.203.187
daohaole@qq.com 218.109.231.189
chenyuelaolao@zju.edu.cn 111.18.235.143
1jiadelaolao@163.com 115.192.203.187
daohaole@qq.com 113.189.58.141
1jiadelaolao@163.com 111.192.203.187
daohaole@qq.com 112.18.58.145
1jiadelaolao@163.com 114.192.203.187
chenyuelaolao@zju.edu.cn 112.18.235.143
daohaole@qq.com 123.89.158.214
chenyuelaolao@zju.edu.cn 112.18.235.143
youdaohaole@qq.com 218.109.231.189
jiadelaolao@163.com 113.192.203.187
youdaohaole@qq.com 218.109.231.189
jiadelaolao@163.com 114.192.203.187
youdaohaole@qq.com 113.189.58.141
youdaohaole@qq.com 123.89.158.214
1jiadelaolao@163.com 113.192.203.187
youdaohaole@qq.com 112.18.58.145

输出样例1

1jiadelaolao@163.com
111.192.203.187 1
112.192.203.187 1
113.192.203.187 1
114.192.203.187 1
115.192.203.187 1
daohaole@qq.com
218.109.231.189 2
112.18.58.145 1
113.189.58.141 1
123.89.158.214 1
youdaohaole@qq.com
218.109.231.189 2
112.18.58.145 1
113.189.58.141 1
123.89.158.214 1

输入样例2

24 5 8
daohaole@qq.com 218.109.231.189
1jiadelaolao@163.com 112.192.203.187
chenyuelaolao@zju.edu.cn 112.18.235.143
jiadelaolao@163.com 112.192.203.187
chenyuelaolao@zju.edu.cn 113.18.235.143
jiadelaolao@163.com 111.192.203.187
daohaole@qq.com 218.109.231.189
chenyuelaolao@zju.edu.cn 111.18.235.143
1jiadelaolao@163.com 115.192.203.187
daohaole@qq.com 113.189.58.141
1jiadelaolao@163.com 111.192.203.187
daohaole@qq.com 112.18.58.145
1jiadelaolao@163.com 114.192.203.187
chenyuelaolao@zju.edu.cn 112.18.235.143
daohaole@qq.com 123.89.158.214
chenyuelaolao@zju.edu.cn 112.18.235.143
youdaohaole@qq.com 218.109.231.189
jiadelaolao@163.com 113.192.203.187
youdaohaole@qq.com 218.109.231.189
jiadelaolao@163.com 114.192.203.187
youdaohaole@qq.com 113.189.58.141
youdaohaole@qq.com 123.89.158.214
1jiadelaolao@163.com 113.192.203.187
youdaohaole@qq.com 112.18.58.145

输出样例2

1jiadelaolao@163.com
111.192.203.187 1
112.192.203.187 1
113.192.203.187 1
114.192.203.187 1
115.192.203.187 1
思路

嵌套map,用外层map的键表示邮箱,外层map的值也是一个map(内层map),内层map的键表示ip,值表示ip出现的次数,最后遍历一下,按照规定要求排序后输出即可。

代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define psi pair<string,int>
int n, Tip, Tlogin;
map<string, map<string, int> > mp;
struct node{
    string email;    //邮箱
    vector<psi> ip;     //存ip登录信息
    int tip;            //ip总数
    int tlogin;         //登录次数
};
vector<node> v, v1;
bool cmp(const node& a,const node& b){
    if (a.tip != b.tip)
        return a.tip > b.tip;
    return a.email < b.email;
}
bool CMP(psi a, psi b){
    if (a.second != b.second)
        return a.second > b.second;
    return a.first < b.first;
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>Tip>>Tlogin;
    string s, ip;
    for (int i = 0; i < n; ++i) {
        cin>>s>>ip;
        mp[s][ip] += 1;
    }

    for (const auto& it : mp) {
        node a;
        a.tlogin = 0;
        a.email = it.first;
        a.tip = it.second.size();
        for (const auto& x : it.second) {
            a.ip.emplace_back(x.first, x.second);
            a.tlogin += x.second;
        }
        v.push_back(a);
    }

    for (auto & i : v)
        if (i.tip > Tip && i.tlogin > Tlogin)
            v1.push_back(i);

    if (!v1.empty()){
        sort(v1.begin(),v1.end(),cmp);
        for (node &it : v1) {
            sort(it.ip.begin(),it.ip.end(),CMP);
            cout<<it.email<<"\n";
            for (psi &p : it.ip) {
                cout<<p.first<<" "<<p.second<<"\n";
            }
        }
    }
    else{
        sort(v.begin(),v.end(),cmp);
        for (node &it : v) {
            if (it.tip != v[0].tip)
                break;
            cout<<it.email<<"\n";
            sort(it.ip.begin(),it.ip.end(),CMP);
            for (psi &p : it.ip) {
                cout<<p.first<<" "<<p.second<<"\n";
            }
        }
    }

    return 0;
}

4.猛犸不上 Ban

2021 robocom 世界机器人开发者大赛-本科组(决赛),# RoboCom,算法,图论,c++

输入样例

5 6 1 5
1 2 1
2 3 2
3 4 3
4 1 5
3 5 4
4 5 1

输出样例

11 6
Lose!
思路

去年比赛的时候硬写了个搜索处理s->s的情况。

这个题目看到一些大佬的题解,还是很容易理解的。

s->t就不用说了,裸的迪杰斯特拉。

s->s的话,这个题目可以拆成s->i + i -> s这两段,但是边不能重复,因此要先将s->i最短路径上面的所有边都标记一下,然后再跑一次s->i(i->s),这次跑的时候就不能用已经被标记过的边了,也是迪杰斯特拉,只不过需要特殊处理判断一下边的使用情况。文章来源地址https://www.toymoban.com/news/detail-595006.html

代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
int inf;

int n,m,s,t;            //如题
int mp[505][505];       //存边
int dis[505];           //表示s到每个点的距离
int dis1[505];          //表示删除第一条路径上的边之后的最短距离
int vis[505];           //标记每个点是否被访问过
int vis1[505][505];     //标记每条边是否被访问过
int pre[505];           //表示每个点的前序最优结点

void init(){
    cin>>n>>m>>s>>t;
    memset(mp,0x3f,sizeof mp);
    memset(dis,0x3f,sizeof dis);dis[s] = 0;
    memset(pre,255,sizeof pre);
    inf = dis[0];
    while (m--){
        int from,to,value;cin>>from>>to>>value;
        mp[from][to] = mp[to][from] = value;
    }
}
void dij(){
    while (true){
        int mn = inf,k = -1;
        for (int i = 1; i <= n; ++i)
            if (!vis[i] && dis[i] < mn)
                mn = dis[i],k = i;
        if (k == -1)
            break;
        vis[k] = true;
        for (int i = 1; i <= n; ++i) {
            if (dis[i] > dis[k] + mp[k][i])
                dis[i] = dis[k] + mp[k][i],pre[i] = k;
        }
    }
}
void dij1(){
    memset(dis1,0x3f,sizeof dis1);dis1[s] = 0;
    memset(vis,0,sizeof vis);
    while (true){
        int mn = dis1[0],k = -1;
        for (int i = 1; i <= n; ++i)
            if (!vis[i] && dis1[i] < mn)
                mn = dis1[i],k = i;
        if (k == -1)
            break;
        vis[k] = true;
        for (int i = 1; i <= n; ++i) {
            if (vis1[k][i])
                continue;
            if (dis1[i] > dis1[k] + mp[k][i])
                dis1[i] = dis1[k] + mp[k][i];
        }
    }
}
int solve(){
    //将s->s 拆分成s->i  +  i->s
    int ans = inf;
    for (int i = 1; i <= n; ++i) {      //遍历每个中间点i
        if (i == s)
            continue;
        for (int from = pre[i], to = i; from != -1 ; to = from, from = pre[from]) {
            vis1[from][to] = vis1[to][from] = true;
        }   //将所有的该路径上的边标记为使用过
        dij1();
        ans = min(ans,dis[i] + dis1[i]);
        for (int from = pre[i], to = i; from != -1 ; to = from, from = pre[from]) {
            vis1[from][to] = vis1[to][from] = false;
        }   //去除标记
    }
    return ans;
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    init();     //输入等初始化操作
    dij();     //跑s->t并且存储pre
    int ans2 = dis[t];
    int ans1 = solve();    //处理s->s
    cout<<(ans1 == inf ? -1 : ans1)<<" ";
    cout<<(ans2 == inf ? -1 : ans2)<<"\n";
    cout<<(ans1 < ans2 ? "Win!" : "Lose!");
    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

领红包