牛客编程巅峰赛S1第6场 - 黄金钻石王者(总结)
牛客编程巅峰赛S1第6场 - 黄金&钻石&王者(总结)
A:牛牛爱奇数
题意
有一个由n个元素组成的数组,牛牛想要将所有的数都变成奇数(即:将所有的偶数都变成奇数),但是他的操作是:一次只能对数组中所有相同元素的值/2。
求最少需要操作多少次,使数组中所有元素都变成奇数
题解
考虑2 4 8这一个数组,如果是从2的元素开始除2,则最终结果为:
2/2=1;
4/2=2,2/2=1;
8/2=4,4/2=2,2/2=1;
ans=1+2+3=6;
显然是错误的,对于这种情况从大的开始处理显然是最优的;换句话说,对于已经操作过的值无需再操作,具体往下看。
我们可以使用c++中map集合,用来存某个数字是否被处理过了
以刚刚的数组为例:
遍历到2时,起初mp[2]=0;于是对2进行除2操作,直到不能被2除为止,对于操作过的数,进行标记mp[x]=1,结合下面代码理解。
遍历到4时,起初mp[4]=0;于是对4进行除2操作,4/2=2,由于2已经操作过了,于是继续除2,由于除2为1了,所以结束(需要注意的是,不是中间出现了已经操作过的数就结束循环,而是一直要处理到不能被2整除为止);这里也就只进行了一次操作
遍历到8和遍历到4类似,也只进行了一次操作
于是最终结果为1+1+1=3,分析知道这才是正确结果。
AC代码(cpp)
class Solution {map<int,int>mp;
public:/*** 返回一个数,代表让这些数都变成奇数的最少的操作次数* @param n int整型 代表一共有多少数* @param a int整型vector 代表n个数字的值* @return int整型*/int solve(int n, vector<int>& a) {// write code heremp.clear();int ans=0;for(int i=0;i<n;i++){int x=a[i];while(x%2==0){if(mp[x]==0) ans++,mp[x]=1;x/=2;}}return ans;}
};
B:牛牛摆放花
题意
n个数组成的数组,每个数有对应的值,现在将这n个数组成一个圆,使得相邻之间数组元素的最大差值尽可能小。
题意
很明显贪心。直接排序,然后有两种方法,一种:从中间往两边分开放,另一种:从两边分别往中间放。
举个栗子:
2 1 1 3 2
首先排序,然后有两种放法,分别为:
第一种放法
2 1 1 2 3
这里是从中间往两边放,先放左边再放右边
对应已经排序的数组下标分别为:
3 1 0 2 4第二种放法
1 2 3 2 1
这里是从两边往中间放,同样先放左边再放右边
对应已经排序的数组下标为:
0 2 4 3 1
通过两种放法可以发现,处理最开始放的最中间两个元素的和最外围的两个元素,对应的位置相差为1外,其他的都相差为2;
于是可以直接先排序后,遍历下数组,对位置为2的数组元素之间进行差值比较。最后对最中间和最外围的进行比较,即可得出答案。
AC代码(cpp)
class Solution {public:/*** 返回按照这些花排成一个圆的序列中最小的“丑陋度”* @param n int整型 花的数量* @param a int整型vector 花的高度数组* @return int整型*/int solve(int n, vector<int>& a) {// write code heresort(a.begin(),a.end());int ans=0;for(int i=0;i+2<n;i++){ans=max(ans,a[i+2]-a[i]);}ans=max(ans,a[1]-a[0]);ans=max(ans,a[n-1]-a[n-2]);return ans;}
};
C:星球游戏
题意
n个结点,m条边构成的图,其中牛牛有一定数量的点,牛妹也有一定数量的点,现在问从牛牛中任选一点到牛妹的任意一点的最短距离是多少?
其中给定牛牛拥有的点数,牛妹拥有的点数,给出相应的图结构,已经图的节点数。
题解
考虑这个问题,从牛牛中任选一点到牛妹的任意一点的最短距离,显然是考虑最短路算法(Dijkstra即可)但是如果朴素的Dijkstra的话肯定会超时,于是考虑堆优化的Dijkstra算法,同时图比较大,于是采用向前星存图。
然后再想,是不是需要跑p遍dijkstra呢(p为牛牛的结点数),显然这样是没有必要的。
直接设一不存在的结点为终点,例如0,向牛牛所拥有的所有点建单向边,边的权值为0;
设一不存在的点为终点,例如:n+1,牛妹所拥有的所有点向设的点建单向边,边的权值为0。
类似于超级起点和超级终点。
于是直接对超级起点跑一遍Dijkstra即可。
AC代码(cpp)
class Solution {static const int maxn=1e5+5;
static const int maxm=5e5+5;
static const int inf=0x3f3f3f3f;
struct e{int to,nxt,val;
}edge[maxm];
int head[maxn],tot;
int dis[maxn],vis[maxn];
struct node{int index,dist;bool operator <(const node &b) const{return dist>b.dist;}
};
public:void init(){memset(head,-1,sizeof(head));tot=0;}void add(int u,int v,int c){edge[++tot].to=v;edge[tot].val=c;edge[tot].nxt=head[u];head[u]=tot;}int dijsktra(int s,int e,int n){memset(dis,inf,sizeof(dis));memset(vis,0,sizeof(vis));dis[s]=0;priority_queue<node> q;q.push(node{s,0});while(!q.empty()){node x=q.top();q.pop();int u=x.index;if(vis[u]) continue;vis[u]=1;for(int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].to,c=edge[i].val;if(dis[v]>dis[u]+c){dis[v]=dis[u]+c;q.push(node{v,dis[v]});}}}return dis[e];}/**** @param niuniu int整型vector 牛牛占领的p个星球的编号* @param niumei int整型vector 牛妹占领的q个星球的编号* @param path int整型vector<vector<>> m条隧道,每条隧道有三个数分别是ui,vi,wi。ui,vi分别是隧道的两边星球的编号,wi是它们之间的距离* @param nn int整型 星球个数n* @return int整型*/int Length(vector<int>& niuniu, vector<int>& niumei, vector<vector<int> >& path, int nn) {// write code hereinit();int s=0,e=nn+1;for(int i=0;i<niuniu.size();i++){add(s,niuniu[i],0);}for(int i=0;i<niumei.size();i++){add(niumei[i],e,0);}for(int i=0;i<path.size();i++){int u=path[i][0],v=path[i][1],c=path[i][2];//cout<<u<<' '<<v<<' '<<c<<endl;add(u,v,c);add(v,u,c);}int ans=dijsktra(s,e,nn);if(ans==inf) return -1;return ans;}
};
牛客编程巅峰赛S1第6场 - 黄金钻石王者(总结)相关推荐
- 牛客编程巅峰赛S1第6场 - 黄金钻石王者 C.dijkstra
链接:https://ac.nowcoder.com/acm/contest/6629/C 来源:牛客网 题目描述 牛牛和牛妹在进行一场星球模拟游戏,游戏规则如下: 游戏地图内共有n个星球,共有m条隧 ...
- 牛客编程巅峰赛S1第6场 - 黄金钻石王者题解
牛牛爱奇数 链接:https://ac.nowcoder.com/acm/contest/6629/A 来源:牛客网 题目描述 在牛牛面前放着n个数,这些数字既有奇数也有偶数,只不过牛牛对奇数情有独钟 ...
- 牛客编程巅峰赛S1第7场 - 黄金钻石A-B-C
比赛链接:牛客编程巅峰赛S1第7场 - 黄金&钻石 文章目录 A.牛牛打怪兽 DFS B.牛牛的冰激凌 贪心 C.数列求值 矩阵快速幂 A.牛牛打怪兽 DFS 题意 身为屯里第一剑士的牛牛来到 ...
- 牛客编程巅峰赛S1第2场 - 黄金钻石 1.规律 2.bfs
链接:https://ac.nowcoder.com/acm/contest/6357/A 来源:牛客网 题目描述 牛牛重新定义了斐波那契数列,牛牛定义f(n) = f(n-1)+f(n+1); f( ...
- 牛客编程巅峰赛S1第3场 - 黄金钻石 A.简单题 B.dfs C.并查集
链接:https://ac.nowcoder.com/acm/contest/6383/A 来源:牛客网 找卧底 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语 ...
- 牛客编程巅峰赛S1第7场 - 黄金钻石 A.dfs B.dpC.快速幂
链接:https://ac.nowcoder.com/acm/contest/6631/A 来源:牛客网 题目描述 题意 身为屯里第一剑士的牛牛来到训练场里闯关,由于过于勤奋,牛牛的宝剑的耐久度降到了 ...
- 算法题解 - 牛客编程巅峰赛S1第3场 - 黄金钻石组
A. 找卧底 题目描述 牛牛今天和大家玩了一个新游戏,除了牛牛以外还有 n 个人参加游戏,现在这 n 个人中的每个人从 [1, n] 中选择一个数字,保证选出的数字均不重复.牛牛作为第 n + 1 个 ...
- 牛客编程巅峰赛S1第2场 - 青铜白银
A.牛牛扔牌 链接:https://ac.nowcoder.com/acm/contest/6219/A 来源:牛客网 题目描述 牛牛现在有n张扑克牌,每张扑克牌都有点数和花色两部分组成.点数为'1' ...
- 牛客编程巅峰赛S2第5场 - 钻石王者 C.Tree III
牛客编程巅峰赛S2第5场 - 钻石&王者 C.Tree III 题目链接 题目描述 给出一棵有n个节点的节点标号为1~n的有根树(根为第一个节点,并给出从第2个节点到第n个节点的父结点),请你 ...
最新文章
- UA MATH565C 随机微分方程V Stationary Measure
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
- jetty部署多个web应用及将jetty配置成服务
- sqlserver2017 +SSMS+ VS2017+SSDT 安装要点及相关组件下载地址
- python中的while循环语句的数组循环_while循环
- 电力系统——基于10机39节点的电力系统仿真(Matlab)
- _OFF方法包含EC依赖的情况,笔记本禁用独显的方法(通过修改DSDT和SSDT)
- 人脸识别 -- 活体检测(张嘴摇头识别)
- 迷惘_飘云羽逸_新浪博客
- LabVIEW动态数据交换DDE
- 【设计】资料合集(1-121)副业学习会
- 卫生保健所短信群发模板:预约挂号、就诊提醒、检查结果通知
- 更改Typora宽度
- 员工信息表,增删查改程序
- gps定位器更换平台指令-GPS定位器接入平台指令
- 留学计算机美国硕士,美国硕士留学计算机专业录取情况
- java viewer 控件_插件制作过程记录(使用TreeViewer贡献视图)
- ettercap文本模式+driftnet监控图片瑞星防火墙无效
- 关于FIN_WAIT1---TCP四次挥手的状态
- 每周分享第 21 期
热门文章
- myeclipse10 tomcat :the source attachment does not contain the source for the file URLClassPath.clas
- 2023华为OD机试真题(Python 语言) B卷真题目录介绍,带你了解什么是华为OD,机试真题
- 此数据库没有有效所有者,因此无法安装数据库关系图支持对象--解决办法
- SpringBoot-09:买家订单---Service层的实现_创建订单
- win7如何看计算机配置,Win7怎么看电脑配置?查看电脑配置的方法
- vue app扫PC端二维码登录
- 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十三)-任意文件下载漏洞(1)
- 数据库建表时一定要设置外键约束关系吗?
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-42 算法训练 送分啦
- linux nginx location,nginx配置文件中的location指令详解