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

本文探讨了算法竞赛中的四道题目,涉及图像匹配、芬兰木棋游戏、打怪升级策略及疫情防控路径规划。通过分析题目,解析了动态规划、图论及搜索算法在解决实际问题中的应用,强调了理解并灵活运用算法的重要性。

目录

写在前面

7-1 懂得都懂

题目

输入格式:

输出格式:

输入样例:

输出样例:

题意

思路

代码

7-2 芬兰木棋

题目

输入格式:

输出格式:

输入样例:

输出样例:

题意

思路

代码

7-3 打怪升级

题目

输入格式:

输出格式:

输入样例:

输出样例:

题意

思路

代码

7-4 疫情防控

题目

输入格式:

输出格式:

输入样例:

输出样例:

题意

思路

代码

反思


写在前面

        这是一个新的比赛,上周六考了4个题,虽然晋级了后面的比赛,但是情况很不理想,我觉得进入最后的决赛有点危险了,补一下这四个题,我觉得挺好的,正好反思反思自己。

        虽然说这是天梯赛L2的难度,但是我当时考试的时候感觉并不好,只A了第一个题,觉得应该是L3的难度,但是自己后面补题发现没有到L3难度,大概在L2-L3之间。总的来看,第一题A了,第二题17分,不知道哪里写错了,后面补题也wa了一个点(好多人都是没有A),第三题是图论,我当时看错题了,只有16分,跑dij也不至于16分,第四题当时暴力dfs只有1分,很离谱,有的点竟然是wa...后面大佬们教了教正解如何去写。

7-1 懂得都懂

题目

        众所周知,在互联网上有很多话是不好直接说出来的,不过一些模糊的图片仍然能让网友看懂你在说什么。然而对这种言论依然一定要出重拳,所以请你实现一个简单的匹配算法。

        现在我们采集了原图的一些特征数据,由 N 个小于 255 的非负整数组成,假设对于给定的若干张由 Mi​ 个同样小于 255 的非负整数组成的新图的特征数据,每个数据都可以由原图中任意四个不同数据的平均值计算而来,则称新图为原图的相似图片。对于给出的数据,请你判断是不是相似图片。

        注意,不同数据指的并非是数据的值不同,而是不能取同一个数据多次。对于两个相同值的数据,如果给出两次,则可以取两次。

输入格式:

        输入第一行是两个整数 N,K (1 ≤ N ≤ 50, 1 ≤ K ≤ 200),表示采集的原图的特征数据个数和新图的张数。        

        接下来一行为 N 个小于 255 的非负整数,表示原图的特征数据。

        最后的 K 行,每行第一个数是 Mi​ (1 ≤ Mi​ ≤ 200),表示新图的特征数据个数。然后是 Mi​ 个小于 255 的非负整数,表示新图的特征数据。

输出格式:

        对于每一张新图,如果为相似图片,则在一行中输出 Yes,否则输出 No。

输入样例:

5 3
4 8 12 20 40
3 11 16 19
3 12 16 19
10 11 11 11 11 11 11 11 11 11 11

输出样例:

Yes
No
Yes

题意

        给出n个数,n小于等于50,有k个询问,每个询问里有若干个数字x,问是否能用一开始n个数中不同下标的4个数字来表示4*x

思路

        考试的时候,一个简单题目被写成这个样子,真的很让人炸心态(吐槽一下)

        因为n不大,我们可以用dfs模拟所有情况出来,大致就是50个里面选4个嘛,C(50,4),时间复杂度不大,然后存下来表示可以组成这个数字,最后在询问的时候判断是否可以即可

代码

const int N = 51;
int n,m,a[N],k,x;
unordered_map<int,int> mp;
inline void dfs(int x,int num,int sum)
{
    if (num==4) 
    {
        mp[sum]=1;
        return;
    }
    for (int i=x+1;i<=n+num-3;i++)
        dfs(i,num+1,sum+a[i]);
}
inline void Case_Test()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
        cin>>a[i];
    dfs(0,0,0);
    while (m--)
    {
        cin>>k;
        bool boo=true;
        for (int i=1;i<=k;i++)
        {
            cin>>x;
            if (mp[x*4]) continue;
            boo=false;
        }
        if (boo) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

7-2 芬兰木棋

题目

        芬兰木棋(Mölkky,又称芬兰木柱)是源自芬兰的一项运动。哲哲将这个运动改造成了赛博朋克单人版,现在场上一开始有 N 根立起的小木棋(上面分别标有一个非负整数),哲哲投掷一根大木棋去击倒这些小木棋以获得分数。分数规则如下:

  • 如果仅击倒 1 根木棋,则得木棋上的分数。
  • 如果击倒 2 根或以上的木棋,则只得击倒根数的分数。(例如击倒 5 根,则得 5 分。)

        哲哲固定站在 (0,0) 点上,四周放着若干个小木棋 (Xi​,Yi​),坐标均为整数。每次哲哲可以朝一个方向扔出大木棋,大木棋会打倒这个方向上离哲哲最近的 k 个小木棋。哲哲游戏水平很高超,所以这个 k 可以自由控制。

        请问哲哲最多能拿多少分,在获得最多分数的情况下最少需要扔出多少次大木棋?

        规则与真实规则有较大出入,真实游玩时请以国际莫尔基组织的规则为准

输入格式:

        输入第一行是一个正整数 N (1 ≤ N ≤ 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值