寒假思维训练day15 牛客练习赛121

牛客练习赛ABCD题解,更新一个题解作为今天的任务收尾。


寒假思维训练day15

摘要:

Part1:B题,B-You Brought Me A Gentle Breeze on the Field_牛客练习赛121 (nowcoder.com)

Part2:  C题,C-氧气少年的水滴 2_牛客练习赛121 (nowcoder.com)

part3:  D题,D-氧气少年的 LCM_牛客练习赛121 (nowcoder.com)


Part1  B题:

1、题意:

2、题解:

1、假设先手,后手的状态是:F[0], F[1], 当F[i] = 1是胜利,等于0是失败,初始时石子数为n,以及题目中的m

2、首先如果最初始是1那必然先手必败,如果初始不为1,但是m >= n - 1那么先手必胜,总的来说就是:

\left\{\begin{matrix} F[0] = 0, F[1] = 1, n = 1 \\ F[0] = 1, F[1] = 0, m >= n - 1\\ else \end{matrix}\right.

3、现在我们讨论else的情况,我们证明一定是由有连取机会的胜:

假设x拥有连取的机会,y没有,但是x输给了y

把x,y每个局面的操作抽象成点,构造成图,当如果找到一条x败给y的路径,也就是x再某个阶段一定处于必败态,因为每次操作必然是至少可以是1(奇数可以改变任何状态,偶数加 + 奇数 = 奇数,奇数 + 奇数 = 偶数),x必然可以先改变自己的状态为必胜态,此时所有输给y的路径都可以改变成必赢路径,所以必胜。

3、代码(cpp):

#include <bits/stdc++.h>
#define int long long 
using namespace std; 
constexpr int N = 1010;
int n, m, p; void solve() {cin >> n >> m >> p; if(n == 1) {cout << "YangQiShaoNian" << endl;return;}else if(n == 2 || m >= n - 1) {cout << "XiaoNian" << endl; return; }else {if(p == 1) cout << "YangQiShaoNian" << endl; else cout << "XiaoNian" << endl;}
}
signed main() {int ts = 1; cin >> ts; while(ts -- ) solve(); return 0;
}

Part2  C题:

1、题意:

2、题解:

我们直接从p这个位置向两边模拟即可,每次维护最左边界和最右边界,时间复杂度最多是O(n * 10), 2e5的范围绰绰有余, 注意边界最后一定要是0和n + 1才能直接输出,否则只能是0。

3、代码(cpp):

#include <bits/stdc++.h>
#define int long long 
using namespace std; 
constexpr int N = 1e6 + 10;
int n, p; 
int a[N], st[N];   
void solve() {cin >> n >> p; for(int i = 0; i <= n + 1; i ++ ) a[i] = 0, st[i] = 0;for(int i = 1; i <= n; i ++ ) cin >> a[i];if(a[p] + 1 < 10) {cout << 0 << ' ' << 0 << endl;return; }int l = p - 1, r = p + 1; int lc = 1, rc = 1;int op = n * 11;while(op --) {if(lc + a[l] >= 10 && l >= 1) lc -= (10 - a[l]), a[l] = 10;  if(rc + a[r] >= 10 && r <= n) rc -= (10 - a[r]), a[r] = 10; if(a[l] >= 10 && l >= 1) lc ++, rc ++, l --;if(a[r] >= 10 && r <= n) lc ++, rc ++, r ++;}if(l == 0) cout << lc << ' '; else cout << 0 << ' '; if(r == n + 1) cout << rc << endl; else cout << 0 << endl;
//     cout << endl;
}
signed main() {int ts; cin >> ts; while(ts -- ) solve(); return 0;
}

Part3  D题:

1、题意:

最初给定一个a,b 每次可以朝着集合中添加gcd(a, b)a + b, 并且a和b是独立的个体,构造一个得到Lcm(a, b)的方案。

2、题解:

首先,这道题并不是可以任意构造的,因为时间是1秒,也就是构造一个尽量少步骤的方案,所以我们来挖掘一下一些性质:

 (1) Lcm(a, b) = a * b / gcd(a,b) = r_a * gcd(a, b) * r_b * gcd(a,b) / gcd(a,b) \\= r_a * r_b * gcd(a, b) = Aim * gcd(a, b) \\

此时我们得到了关键的东西,我们将其进行二进制拆解,Aim * gcd(a, b) = (2^{j_1} + 2^{j_2} + 2^{j_3} + ... + 2^{j_k}) * Aim,j_iAim的各个二进制位。

据此,我们不妨先往集合中添加两个gcd(a, b), 因为每次一个一个加非常数字非常大,考虑倍增优化:

d = gcd(a, b) \\ have \left \{ d, d \right \} \\ d * 2^1 = d + d\\ d * 2^2 = d * 2^1 + d * 2^1\\ ....\\ d * 2^n = d * 2^{n - 1} + d * 2^{n - 1}

此时我们不妨处理出来所有Aim的二进制位上的数与gcd(a,b)的乘积,最后通过累加得到Aim * gcd(a, b),也就是Lcm(a,b)

3、代码(cpp):

#include <bits/stdc++.h>
#define int long long 
using namespace std; 
constexpr int N = 1e6 + 10;
int n, m; 
void solve() {int a, b; cin >> a >> b; if(a > b) swap(a, b); if(b % a == 0) {cout << 0 << endl;return; }int d = __gcd(a, b); int aim = a * b / d / d;  int c = -1, t = -1;int cnt = 0; for(int i = 0; i <= 62; i ++ )if(aim >> i & 1ll) {if(t == -1) t = i; c = i;++ cnt; }
//     cout<<cnt<<endl;cout << 2 * (c + 1) + cnt - 1 << endl;cout << 1 << ' ' << a << ' ' << b << endl;cout << 1 << ' ' << a << ' ' << b << endl;for(int i = 1; i <= c; i ++ ) cout << 2 << ' ' << d * (1ll << (i - 1)) << ' ' << d * (1ll << (i - 1)) << endl,cout << 2 << ' ' << d * (1ll << (i - 1)) << ' ' << d * (1ll << (i - 1)) << endl;if(cnt >= 2) {int state = d * (1ll << t);for(int i = t + 1; i < 62; i ++ ) {if(aim >> i & 1ll) { cout << 2 << ' ' << state << ' ' << d * (1ll << i) << endl;state += d * (1ll << i); }}}}
signed main() {int ts; cin >> ts; while(ts -- ) solve(); return 0;
}

感谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职言圈 | 小伙年薪95w,女朋友父母却爱搭不理,如今上岸国家电网,人不到,叔叔阿姨吃饭都不动筷子...

在职场中&#xff0c;每个人都经历着不同的起伏和挑战。有时候&#xff0c;我们会面临着职业生涯上的起伏&#xff0c;但正是这些经历让我们成长&#xff0c;让我们更加坚韧。 就像这位网友一样&#xff0c;他在过去的一年里经历了美团L8的职位和年薪95W&#xff0c;却面临着女…

Sentinel解密:SlotChain中的SLot大揭秘

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Sentinel解密&#xff1a;SlotChain中的SLot大揭秘 前言SlotChain简介&#xff1a;Sentinel的第一道防线入场仪式&#xff1a;SlotChain中的初始化SlotSlotChain的执行流程&#xff1a;从规则解析到流…

数据可视化练习

文章目录 试题示例 试题示例 绘制下图所示的表格 根据下表的数据&#xff0c;将班级名称一列作为x轴的刻度标签&#xff0c;将男生和女生两列的数据作为刻度标签对应的数值&#xff0c;使用bar()函数绘制下图所示的柱形图。 方式一 import numpy as np import matplotlib.p…

Kotlin快速入门系列3

Kotlin条件、循环控制 IF条件控制 与Java类似&#xff0c;一个if语句可包含布尔表达式和一条或多条语句。 fun compare(a:Int,b:Int) : Int{//常规传统用法var max aif (b>a) max breturn max//使用elsevar mMax : Intif(a>b){mMax a}else{mMax b}return mMax//使…

Unity中URP下额外灯的距离衰减

文章目录 前言一、额外灯的距离衰减二、DistanceAttenuation函数的传入参数1、distanceSqr2、distanceAndSpotAttenuation3、_AdditionalLightsAttenuation4、GetPunctualLightDistanceAttenuation函数三、DistanceAttenuation函数的程序体 前言 在上一篇文章中&#xff0c;我…

一个新的springboot-vue项目如何启动起来

一个新的springboot-vue项目如何启动起来 1.导入mysql 打开yml文件修改数据库密码 名称 用户名 2.打开pom.xml配置maven依赖 尽量换成自己使用过的版本号&#xff0c;或者打开中央仓库搜索相关内容版本号&#xff1a;https://central.sonatype.com/ 注解为黄色 说明工程…

《合成孔径雷达成像算法与实现》Figure5.17

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

@JsonIgnore的使用及相关问题的解决

目录 1 前言 2 对比及其使用方法 3 遇到的相关问题及解决方法 1 前言 在我们编写的后端项目中&#xff0c;有时候可能需要将某个实体类以JSON格式传送给前端&#xff0c;但是其中可能有部分内容我们并不想传送&#xff0c;这时候我们选择将这部分内容变成Null&#xff0c;这…

Flutter 点击空白处关闭软键盘,点击非TextField 关闭软键盘的方法

1&#xff1a;点击空白处(非控件上)关闭软键盘。 此方法有个问题&#xff0c;就是点击非空白区域&#xff0c;不会关闭软键盘&#xff0c;比如点击旁边的其他按钮&#xff0c;则软键盘还在。只适合点击空白处关闭软键盘 在 main.dart 入口 build 中增加 builder: (context, ch…

一文速通Python添加、修改和删除字典元素

添加、修改和删除字典元素是 Python 中使用字典时常见的操作。字典是一种无序、可变的数据结构&#xff0c;用于存储键值对。在 Python 中&#xff0c;对字典元素进行添加、修改和删除操作可以帮助我们动态地管理数据&#xff0c;方便地根据需求对字典进行更新和维护。 一、添…

图文解析交流慢充原理和握手协议以及OBC工作原理

1.接口定义 2.硬件连接原理 2.obc工作原理 OBC里面包括单片机1和单片机2&#xff0c;DSP。 有的厂家方案只有一个单片机&#xff0c;CC/CP部分直接用DSP实现。交流桩的ARM控制K1、K2&#xff0c;S1。单片机1控制K3。单片机2控制S2。DSP控制K4。BMS控制PDU里面的K5&#x…

使用Opencv-python库读取图像、本地视频和摄像头实时数据

使用Opencv-python库读取图像、本地视频和摄像头实时数据 Python中使用OpenCV读取图像、本地视频和摄像头数据很简单&#xff0c; 首先需要安装Python&#xff0c;然后安装Opencv-python库 pip install opencv-python然后在PyCharm或者VScode等IDE中输入对应的Python代码 一…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理&#xff0c;简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途&#xff1a; 项…

Transformer and Pretrain Language Models3-6

Pretrain Language Models预训练语言模型 content&#xff1a; language modeling&#xff08;语言模型知识&#xff09; pre-trained langue models(PLMs&#xff09;&#xff08;预训练的模型整体的一个分类&#xff09; fine-tuning approaches GPT and BERT&#xff08;…

【阻塞队列】阻塞队列的模拟实现及在生产者和消费者模型上的应用

文章目录 &#x1f4c4;前言一. 阻塞队列初了解&#x1f346;1. 什么是阻塞队列&#xff1f;&#x1f345;2. 为什么使用阻塞队列&#xff1f;&#x1f966;3. Java标准库中阻塞队列的实现 二. 阻塞队列的模拟实现&#x1f35a;1. 实现普通队列&#x1f365;2. 实现队列的阻塞功…

立创EDA学习:设计收尾工作

布线整理 ShiftM&#xff0c;关闭铺铜显示 调整结束后再使用快捷键”ShiftM“打开铺铜 过孔 在空白区域加上一些GND过孔&#xff0c;连接顶层与底层的铺铜。放置好”过孔“后&#xff0c;隐藏铺铜&#xff0c;观察刚才放置的过孔有没有妨碍到其他器件 调整铺铜 先打开铺铜区&…

《Vue3 基础知识》 Vue2+ElementUI 自动转 Vue3+ElementPlus(GoGoCode)

前言 GoGoCode 一个基于 AST 的 JavaScript/Typescript/HTML 代码转换工具。 AST abstract syntax code 抽象语法树。 实现 第一步&#xff1a;安装 GoGoCode 插件 全局安装最新的 gogocode-cli 即可 npm i gogocode-cli -g查看版本 gogocode-cli -V相关插件说明 插件描述…

【多态】10分钟大白话讲解Java中的多态

1.多态的概念 多态(polymorphism)本来是生物学里的概念&#xff0c;表示地球上的生物在形态和状态方面的多样性。 而在java的面向对象中&#xff0c;多态通俗点说就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生不同的状态。也就是说…

先进计算产业促湖南数字经济规模突破1.7万亿元

中新网湖南新闻1月26日电 (于冬阳 周沁怡)“截至2023年底&#xff0c;集群汇聚了中电长城、飞腾、麒麟等1400余家企业&#xff0c;产值达1800亿元。”1月26日&#xff0c;国家新一代自主安全计算系统产业集年度工作推进会在长沙举行&#xff0c;国家新一代自主安全计算系统产业…

python-分享篇-使用海龟turtle模块实现幸福大转盘

文章目录 准备代码效果 准备 一、根目录下放图片 代码 from turtle import * import turtle from random import randint import sys #屏幕初始化 screen turtle.Screen() screen.title("幸运大转盘 转转转~") screen.setup(480,450) screen.bgpic("转盘.png…