看群友在水这个比赛玩玩,于是也去打了一下重现赛。
事实证明,群友轻松AK,而我只会暴力。
总的难度就是PAT甲的难度吧,数据很不错,恶心的一批。
补题完结

2021RoboCom机器人开发者大赛官方题解

目录

  • 7-1 懂的都懂 (20 分)【简单 / 暴力 + 哈希表】
  • 7-2 芬兰木棋 (25 分)【中 / map 贪心】
  • 7-3 打怪升级 (25 分) 【中 / 最短路 记得维护值 和 存路径】
  • 7-4 疫情防控 (30 分)【难度: 难 / 并查集 思维】

7-1 懂的都懂 (20 分)【简单 / 暴力 + 哈希表】

方法一: 自己的傻叉做法 预处理所有的4个数的平均值。用double 注意精度

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
double a[N],b[N];
map<double,int>mp;
int main(void)
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%lf",&a[i]);for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){for(int k=j+1;k<n;k++){for(int z=k+1;z<n;z++){int temp=a[i]+a[j]+a[k]+a[z];mp[temp/4.0]++;}}}}while(m--){int t; scanf("%d",&t);bool flag=1;for(int i=0;i<t;i++) {scanf("%lf",&b[i]);if(!mp[b[i]]) flag=false;}if(flag) puts("Yes");else puts("No");}return 0;
}

方法二: 只需处理所有的四个数的和即可,不用求平均

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N],b[N];
map<int,int>mp;
int main(void)
{scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&a[i]);for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){for(int k=j+1;k<n;k++){for(int z=k+1;z<n;z++){int temp=a[i]+a[j]+a[k]+a[z];mp[temp]++;}}}}while(m--){int t; scanf("%d",&t);bool flag=1;for(int i=0;i<t;i++) {scanf("%d",&b[i]);if(!mp[b[i]*4]) flag=false;}if(flag) puts("Yes");else puts("No");}return 0;
}

7-2 芬兰木棋 (25 分)【中 / map 贪心】

大木棋会打倒这个方向上离哲哲最近的 k 个小木棋
读了半天的假题。

1 1 1
2 2 2
3 3 1
步数为3 先打1再2再3
#include<bits/stdc++.h>
using namespace std;
typedef long long  LL;
LL ans,n,cnt;
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
map<pair<LL,LL>,vector< pair<LL,LL> > >mp;//斜率映射到对应的距离加分数
int main(void)
{cin>>n;for(int i=1;i<=n;i++){LL x,y,c; cin>>x>>y>>c;ans+=c;LL temp=gcd(abs(x),abs(y));mp[{x/temp,y/temp}].push_back({x*x+y*y,c}); //注意: 距离必须是x*x+y*y 单独的x是不行的因为还有y轴上的点}cnt=0;for(auto i=mp.begin();i!=mp.end();i++)//枚举所有的方向{auto ve=i->second;sort(ve.begin(),ve.end());//距离排序for(int j=0;j<ve.size();j++){if(ve[j].second!=1) {cnt++;if(j-1>=0&&ve[j-1].second==1) cnt++;}}if(ve[ve.size()-1].second==1) cnt++;}cout<<ans<<" "<<cnt;return 0;
}

7-3 打怪升级 (25 分) 【中 / 最短路 记得维护值 和 存路径】

写的可以过,不过有点太卡时间。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m,t,x;
int g[N][N],dist[N],st[N];
int startx,maxv=1e9;
int p[N][N];
map<int,int>val,ans;//val存的是该点最大的价值,ans存路径
void Dijkstra(int x)
{memset(dist,0x3f,sizeof dist);memset(st,0,sizeof st);dist[x]=0;for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++) if(!st[j]&&(t==-1 || dist[j]<dist[t] )) t=j;st[t]=1;for(int j=1;j<=n;j++){if(dist[j]>dist[t]+g[t][j]){dist[j]=dist[t]+g[t][j];val[j]=val[t]+p[t][j];ans[j]=t;}else if(dist[j]==dist[t]+g[t][j]){if(val[j]<val[t]+p[t][j]){val[j]=val[t]+p[t][j];ans[j]=t;}}}}int temp=0;for(int i=1;i<=n;i++) temp=max(temp,dist[i]);if(temp<maxv) maxv=temp,startx=x;
}
int main(void)
{memset(g,0x3f,sizeof g);scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);g[a][b]=g[b][a]=c;p[a][b]=d,p[b][a]=d;}for(int i=1;i<=n;i++) Dijkstra(i);//每一个点跑一下最短路,找到最短路中最大的值,最小的值printf("%d\n",startx);val.clear(),ans.clear();Dijkstra(startx);scanf("%d",&t);while(t--){int x; scanf("%d",&x);int node=x;vector<int>path;while(node){path.push_back(node);node=ans[node];}for(int i=path.size()-1;i>=0;i--) {if(i!=path.size()-1) printf("->");printf("%d",path[i]);}printf("\n%d %d\n",dist[x],val[x]);}return 0;
}

7-4 疫情防控 (30 分)【难度: 难 / 并查集 思维】

很轻松的暴力做法骗22分

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int h[N],e[N],ne[N],idx;
int st[N],vis[N];
int n,m,t;
int startx,endx;
bool flag;
void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++;}
void dfs(int u)
{st[u]=1;if(u==endx&&!vis[u]) {flag=1;return;}for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(!st[j]&&!vis[j]) dfs(j);}
}
int main(void)
{memset(h,-1,sizeof h);cin>>n>>m>>t;for(int i=0;i<m;i++){int a,b; cin>>a>>b;add(a,b),add(b,a);}while(t--){int c,q; cin>>c>>q;vis[c]=1;int ans=q;for(int i=0;i<q;i++){memset(st,0,sizeof st);flag=0;cin>>startx>>endx;if(!vis[startx])dfs(startx);if(flag) ans--;}cout<<ans<<endl;}return 0;
}

正解: 考虑将所有操作离线,逆序处理。即,先删除要删除的所有点,再倒着往里加点,顺便把询问处理掉,用并查集维护即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef pair<int,int> PII;
vector<int>ve[N];//存边
vector<PII>vis[N];
int p[N],s[N],ans[N];
int n,m,t;
int find(int x)
{if(x!=p[x]) p[x]=find(p[x]);return p[x];
}
int main(void)
{cin>>n>>m>>t;for(int i=1;i<=n;i++) p[i]=i;for(int i=1;i<=m;i++){int a,b; cin>>a>>b;ve[a].push_back(b) ;ve[b].push_back(a);}for(int i=1;i<=t;i++){int k,a,b; cin>>s[i]>>k;p[s[i]]=0;//标记为坏的 while(k--){cin>>a>>b;vis[i].push_back({a,b});}}for(int i=1;i<=n;i++){if(p[i]){for(int j=0;j<ve[i].size();j++){if(p[ve[i][j]]) p[find(i)]=find(ve[i][j]);}}}for(int i=t;i;i--){for(int j=0;j<vis[i].size();j++)//查询{int fa=find(vis[i][j].first);int fb=find(vis[i][j].second);if(fa!=fb || fa==0 ) ans[i]++;}int k=s[i]; p[k]=k;//添加点for(int j=0;j<ve[k].size();j++)//并查集处理{if(p[ve[k][j]]) p[find(k)]=find(ve[k][j]);}}for(int i=1;i<=t;i++) cout<<ans[i]<<endl;return 0;
}

2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】相关推荐

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

    文章目录 比赛介绍 7-1 懂的都懂(20分) 7-2 芬兰木棋(25分) 7-3 打怪升级(25分) 7-4 疫情防控(30分) 比赛介绍 比赛信息 比赛官网:https://www.robocom ...

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

    文章目录 7-1 冒险者分队 20 7-2 拼题A打卡奖励 25 7-3 快递装箱 25 7-4 塔防游戏 30 7-1 冒险者分队 20 7-1 冒险者分队 分数 20 作者 DAI, Longao ...

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

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

  4. 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)7-1 冒险者分队 (20 point(s)) (思维)

    冒险者分队是人气 MMORPG<最终幻想 14>里的一个游戏系统.玩家通过招募 NPC (非玩家角色)组成小队完成特定任务后可以获取丰厚的奖励. 由于完成任务有能力的要求,因此我们需要对 ...

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

    7-1 绿地围栏 (20 分) 市政规划了一块绿地,需要采购一批围栏将绿地围起来. 为了简单起见,我们假设绿地的形状是个封闭连通的规则多边形,即所有边都是互相垂直或平行的,并且没有交叉的十字边.我们指 ...

  6. 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4 猛犸不上 Ban

    输入样例: 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为起 ...

  7. 2021 RoboCom 世界机器人开发者大赛-本科组(决赛)7-4猛犸不上 Ban(最短路)

    样例输入: 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! 分析:对于第二种选择显然直接跑一边最短路就可以了,这里就不多说了, ...

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

    目录 7-1 懂的都懂 (20分) 输入格式: 输出格式: 输入样例: 输出样例: 解析: 代码: 7-2 芬兰木棋 (25分) 输入格式: 输出格式: 输入样例: 输出样例: 解析: 代码: 7-3 ...

  9. 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)7-2 芬兰木棋 (25 分)

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

最新文章

  1. Python 爬虫练手项目—酒店信息爬取
  2. Ubuntu 18.04 更改静态IP
  3. Serenity安装和创建DEMO--学习第一天
  4. 小游戏发布云测试工具,中小团队的“小又快”可以这么来
  5. 工业大数据全景解读和应用案例
  6. canvas笔记-二次贝塞尔曲线与三次贝塞尔曲线的用法
  7. Spring框架----Spring的基于XML的AOP的实现
  8. 浏览器兼容性问题——IE不支持却很实用的CSS属性Outline和Child
  9. 181129每日一句
  10. halcon实例实战第二版_R语言实战(第2版):第二章 创建数据集(01)
  11. 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云(2)
  12. vue整合ueditor
  13. 时速云:基于K8S的容器PaaS,将成为未来IT基础设施的重要组成部分
  14. visual basic_什么是Visual Basic?
  15. PyCharm运行问题:AssertionError: Torch not compiled with CUDA enabled
  16. 苹果邮箱登录入口_LOL手游只有一种登录方式怎么办?只有拳头账号登录入口解决方法...
  17. pdo mysql num rows_PDO参数说明
  18. BMS电池管理控制器模型,包括:SOC,SOE和SOH,各个模块含有解析部分,模型和解析单独出
  19. 微幅波的解析解求解及弥散方程的推导
  20. 阿里云启动视频云V5计划,全面赋能生态合作伙伴

热门文章

  1. macOS上实现Qt应用程序做文件关联打开
  2. 2019.1.11英语笔记1
  3. python记录_day14 内置函数二 迭代 二分法
  4. 个性化背词软件 更新ing(9-4)
  5. 如何将你拍摄的照片转换成全景图及六面体(PTGui)
  6. Python基础之最大公约数与最小公倍数
  7. 洛谷U4807抽水机[最小生成树]
  8. 将可执行程序的内存空间扩展到3GB(windows)
  9. 自己用到的vim常用命令
  10. Nero 9 Lite 9.4.12.708 最新最好破解刻录软件下载