2021中兴捧月神算师算法赛,4-24第一场,第四题:D-换队伍,2021-4-28

article/2025/10/14 3:46:17

第四题:D-换队伍

在这里插入图片描述
在这里插入图片描述

分析:
1.问题本身很简单,也只有两条队伍,一个队伍中的人换到另一个队伍的末尾。问题在于对其他人排队位置的保存和排序。
2.用什么数据结构进行保存,是一个很关键的问题,对问题解决的方法和时间复杂度都有很大关系。如果使用简单的数组,那么每执行一次换队伍,会需要对后面的人进行前移一个位置,那么时间复杂度就上升了。
3.很显然,一看到题,第一个想法就是链表,使用两个链表分别表示两个队伍,每个人作为链表的一个结点。当执行换队伍操作时,从一个链表中删除一个结点然后加到另一个链表末尾。这个方法是可行的,但是由于只有两个队伍,因此还可以采取更直接的方法。比如直接用一个map,将第i个人映射到{队伍0或1,在队伍中序号}这样的映射对中。
4.题目中保证了给的序号是正常的(不会超限),因此不需要进行序号判断可以直接进行换队伍。且保证队伍一定会有一个人。
5.注意n1,n2最大为10^5,因此一共最多可以有2x10 ^5 个人。
6.还有一个问题,为什么不直接用两个数组来表示队伍,换队伍时在原位置置0,在另一个队伍末尾赋值人员编号。这样在每个人只换一次队伍时是简单办法,但是如果某人换两次队伍,就会存在找不到这个人的问题,这也是需要考虑的
7.如果使用链表,要注意链表末尾结点要不同处理,判断下一结点是否指向NULL。

代码:
下面以别人提交的方案进行理解,来源均注明

方案1:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47614394

这个方案是代码量小。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n1,n2,q;
int a[2][N*3],cnt[2];
int pos[N*2];
int main(){cin>>n1>>n2>>q;for(int i=1;i<=n1;i++){a[0][i]=i;pos[i]=i;      //给队伍1的每个人赋值序号,pos存储位置}for(int i=1;i<=n2;i++){a[1][i]=i+n1;pos[i+n1]=N*10+i; //同理,给队伍2同样操作,但是把位置赋值 10N+i,避免与队伍1 的位置重复}cnt[0]=n1,cnt[1]=n2;   //对两个队伍的人数 计数for(int i=1;i<=q;i++){     int x;cin>>x;if(pos[x]<N*10)a[1][++cnt[1]]=x,pos[x]=N*10+cnt[1];// 如果原本pos[x]小于10N,说明原来是队伍1的,那么把他放到队伍2的最末尾// 队伍2 ++cnt[1],计数加1,然后把这个人的位置赋值10N+cnt[1]else a[0][++cnt[0]]=x,pos[x]=cnt[0];// 反之,说明原来是队伍2的,那么队伍1 cnt[0]++// 然后把他放到队伍1末尾最后一个,位置赋值 cnt[0]}for(int i=1;i<=cnt[0];i++)if(pos[a[0][i]]==i)cout<<a[0][i]<<" ";cout<<endl;for(int i=1;i<=cnt[1];i++)if(pos[a[1][i]]==N*10+i)cout<<a[1][i]<<" ";cout<<endl;//最后进行一个判断输出
}

方案2:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47614831
基本和上面思路相同,存储队伍号,和在该队伍的位置,不同之处在于定义了一个结构体来存储

#include<bits/stdc++.h>
#define repo(i,c,n) for(int i = c; i < n; i++)
using namespace std;struct Pos{int que_num;int pos;
};int main()
{int n1,n2,q;cin>>n1>>n2>>q;//q1表示队伍1,q2表示队伍2vector<int> q1(n1+1),q2(n2+1);//定义一个辅助数组存储每个编号以及其在对应的队伍中的位置vector<Pos> que_num_pos(n1+n2+1);repo(i,1,n1+1){q1[i] = i;que_num_pos[i].que_num = 1;que_num_pos[i].pos = i;}repo(i,n1+1,n1+n2+1){q2[i-n1] = i;que_num_pos[i].que_num = 2;que_num_pos[i].pos = i-n1;}repo(i,0,q){int tmp;cin>>tmp;if(que_num_pos[tmp].que_num == 1){q1[que_num_pos[tmp].pos] = 0;que_num_pos[tmp].que_num = 2;n2++;que_num_pos[tmp].pos = n2;q2.emplace_back(tmp);}else{q2[que_num_pos[tmp].pos] = 0;que_num_pos[tmp].que_num = 1;n1++;que_num_pos[tmp].pos = n1;q1.emplace_back(tmp);}}//输出结果for(vector<int>::iterator iter = q1.begin(); iter != q1.end(); ++iter){if(*iter == 0) continue;cout<<*iter<<" ";}cout<<endl;for(vector<int>::iterator iter = q2.begin(); iter != q2.end(); ++iter){if(*iter == 0) continue;cout<<*iter<<" ";}return 0;
}

还有一种方案,大同小异,以一个数组来存队列号,两个数组分别存位置

方案3:
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47572108

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>using namespace std;
typedef long long LL;
typedef pair<int, int> PII;int a;
set<PII> s1, s2;
int mp[1000010];int main()
{int n1, n2, q;cin >> n1 >> n2 >> q;for (int i = 1; i <= n1; i ++){s1.insert({i, i});mp[i] = i;}for (int i = n1 + 1; i <= n1 + n2; i ++){s2.insert({i, i});mp[i] = i;}int idx = n1 + n2;while (q --){cin >> a;          //  a 为人员编号   mp[a]为位置if (s1.count({mp[a], a})) //count()--返回某个值元素的个数,这里存在就执行if{s1.erase({mp[a], a}); //erase()--删除集合中的元素mp[a] = ++ idx;s2.insert({mp[a], a});//insert()--在集合中插入元素}else{s2.erase({mp[a], a});mp[a] = ++ idx;s1.insert({mp[a], a});}    //  改变位置都是排在最后,那么只要把 mp[a]赋值为当前最大值}    //  然后加到对应的红黑树 s1或s2 中,会自动按键值大小排序,最后输出for (auto x:s1)cout << x.second << ' ';cout << endl;for (auto x:s2)cout << x.second << ' ';
}

https://www.cnblogs.com/yoke/p/6867302.html

set和pair 结合使用

2.元素的插入与中序遍历

    采用inset()方法把元素插入到集合中,插入规则在默认的比较规则下,

是按元素值从小到大插入,如果自己指定了比较规则函数,则按自定义比较规则函数插入。

使用前向迭代器对集合中序遍历,结果正好是元素排序后的结果。

s.insert(5); //第二次插入5,重复元素,不会插入

4.元素的删除
与插入元素的处理一样,集合具有高效的删除处理功能,并自动重新调整内部的红黑树的平衡。

set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序


http://chatgpt.dhexx.cn/article/k1SmMdd9.shtml

相关文章

中兴捧月算法挑战赛-RAW夜景图像去噪总结

最终排名 85/1159 网址&#xff1a;https://zte.hina.com/zte/denoise 无缘复赛&#xff0c;太菜了&#xff0c;不好意思说自己学去噪的了&#xff0c;代码会开源&#xff0c;但是感觉没什么人看吧 尝试过的模型 DnCNN&#xff1a;很差&#xff0c;0分UNet&#xff1a;很蓝…

2021中兴捧月神算师算法赛,4-24第一场,第二题:B - 切绳子,2021-4-27

第二题&#xff1a;B - 切绳子 题目如下图所示&#xff1a; 这道题目难度中等&#xff0c;但是有很多细节要注意。 分析&#xff1a; 1.首先数据类型问题&#xff0c; 1<n<1e18,这个显然超过了int的长度65535&#xff0c;需要使用big int 或者是long long 型进行定义…

中兴捧月算法-切绳子

中兴捧月算法-切绳子 题目描述 来源&#xff1a;牛客网 示例一&#xff1a;

中兴捧月比赛DIJKSTRA派算法说明

因为文章包含太多公式&#xff0c;无法复制&#xff0c;所以只能截图 我现在不知道怎么传源码&#xff0c;代码的话如果有人要&#xff0c;留言QQ 输出的次优解路径为&#xff1a; S->N2->N4->N5->N3->N7->N8->N14->N13->N12-…

2019中兴捧月·总决赛心得

2019中兴捧月总决赛心得 原文链接&#xff1a;https://hey-yahei.cn/2019/05/25/zte_challenge_final/ 赛题背景 与初赛类似&#xff0c;不过初赛更多关注的是加速&#xff0c;而总决赛更关注的是压缩。 原始模型是一个简单的3x112x112输入大小的resnet18&#xff0c;人脸识…

2020年中兴捧月傅里叶派决赛题目

目录 题目&#xff1a; 模型建立 题目分析 注意的小问题 计算结果 代码 模型改进和精细预测 写在最后 题目&#xff1a; 假设&#xff1a; 病毒正在一个居民总数为N100,000, 的城市里扩散。在我们研究的时间段内&#xff08;300天&#xff09;&#xff0c;没有新生儿…

2022中兴捧月算法挑战赛(RAW图像去噪)——初赛到决赛总结与反思

文章目录 1. 初赛经历&炼丹详情1.1 初赛经历1.2 炼丹详情 2、复赛经历&反思与总结2.1 复赛经历2.2 复赛反思 3、决赛经历&反思与总结3.1 决赛题目3.2 决赛思路总结3.3 冠军方案记录3.4 决赛经历3.5 决赛反思 1. 初赛经历&炼丹详情 1.1 初赛经历 最后分数57.2…

2020中兴捧月算法大赛迪杰斯特拉赛道初赛题解

目录 摘要1 程序中使用的数据结构1.1 几个基本数据类型1.2 车道(Lane)1.3 道路(Road)1.4 站点(Station)1.5 货物(Goods)1.6 系统资源(SystemResource)1.7 物流系统(LogisticsSystem) 2 算法思路2.1 初赛初版&#xff1a;路由表、深度优先搜索、路径惩罚2.1.1 搜索策略2.1.2 路径…

中兴捧月营销精英挑战赛回顾

先上图 为期四天的比赛结束了&#xff0c;把这次比赛的收获做一个总结和分享。希望能帮上后面有需要的同学吧。 主要内容分为比赛流程、决赛内容和心得体会三部分。 一.比赛流程 比赛流程分为三部分&#xff0c;初赛、复赛和决赛。初赛开始需要每位同学从瑞伊、加勒斯和奥格…

2023中兴捧月图像赛道-任意尺度盲超分初赛第三方案

任意尺度盲超分-初赛第三方案 吐槽篇方案篇一、左脚踩右脚二、梯度攻击 建议篇 吐槽篇 正文内容.正式讲述方案之前&#xff0c;容我先吐槽两句&#xff0c;真tm的是比赛&#xff0c;纯纯ex人。学历厂就别打着以赛招聘的口号&#xff0c;要985计算机的直接去他们学校里宣讲嘛&am…

中兴捧月之旅

上个月底&#xff0c;我怀着激动的心情来到古都西安参加了第十一届中兴捧月算法大赛的全国总决赛&#xff0c;因为这是我第一次参加的线下封闭开发的现场竞赛&#xff0c;特以此文记录这趟快乐的西安之旅。 中兴捧月是中兴通讯公司举办的大型算法比赛&#xff0c;今年共有6大赛…

2020中兴捧月算法大赛——傅里叶赛道 第1名方案

大家好&#xff0c;我是轶扬。 最近我在总结研究生阶段参与的一些项目和比赛&#xff0c;翻到了2020年参加的中兴捧月算法大赛&#xff0c;题目很有意思&#xff0c;解法上也有一些有趣的创新&#xff0c;所以拿出来特别记录一下。 中兴捧月算法大赛是中兴通讯公司主办的算法赛…

2023 中兴捧月算法挑战赛-自智网络-参赛总结

“中兴捧月”是由中兴通讯面向在校大学生举办的全球性系列赛事活动&#xff0c;致力于培养学生建模编程、创新、方案策划和团队合作能力。今年是在学校的宣传下了解到比赛&#xff0c;最初抱着学习的态度报名了比赛&#xff0c;最终进入了决赛&#xff0c;完成了封闭的开发与赛…

谈谈中兴捧月大赛决赛以及总结

前言 四月份&#xff0c;在师兄的推荐下&#xff0c;报名参加了中兴捧月大赛。一开始只是为了混一个面笔试的资格&#xff08;因为提交有效成绩即可免笔试&#xff09;&#xff0c;然后为了找一个简单的赛道&#xff0c;注册了几个号看了两三个赛道的题目。发现自己每个都不熟…

我得重新集结部队(模拟)

思路&#xff1a;感觉问题不大&#xff0c;不知道为啥一直WA WA代码&#xff1a; package 练习; import java.util.*; import java.io.*; import java.lang.*; public class Main{public static void main(String[] args) {Scanner scnew Scanner (System.in);int nsc.nextInt…

攻防演习紫队第一篇之介绍和组织

文章目录 0x01 什么是紫队0x02 如何组织攻防实战攻防演习一、实战攻防演习组织要素二、实战攻防演习组织形式三、实战攻防演习组织关键 摘抄 0x01 什么是紫队 ● 紫队&#xff0c;一般是指网络实战攻防演习中的组织方。 ● 紫队是在实战攻防演习中&#xff0c;以组织方角色&am…

java毕业设计民兵管理系统(附源码、数据库)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

哨兵数据的介绍

转载&#xff1a;[哨兵数据的介绍(http://www.spacemagazines.org/h-nd-193.html) “哨兵”卫星家族概览 据欧洲航天局网站2014年5月28日的报道&#xff0c;欧洲哨兵&#xff0d;1A&#xff08;Sentinel&#xff0d;1A&#xff09;卫星尽管还没有正式工作&#xff0c;但已为波…

创建Dota游戏中的兵营类(Barrack),创建3个兵营,通过控制台为每个兵营定义兵营名称,并指定该兵营需要创建的士兵人数。

上面图标里的这个类是创建的兵营类,下面的代码是兵营类的测试类: package com.xjc; /任务一&#xff0c; 1.创建Dota游戏中的兵营类&#xff08;Barrack&#xff09;&#xff0c;该类中有一个类成员变量count&#xff08;类属性&#xff09;、一个实例变量name和另一个实例变…

敌兵布阵问题

一 问题描述 A 国在海岸线沿直线部署了 N 个工兵营地&#xff0c;C 国通过先进的监测手段&#xff0c;对 A 国的每个工兵营里的人数都掌握的一清二楚&#xff0c;每个工兵营的人数都可能发生变动&#xff0c;可能增加或减少若干人数。 二 输入和输出 1 输入 第 1 行包含一个…