2024牛客寒假算法基础集训营2

目录

A.Tokitsukaze and Bracelet

B.Tokitsukaze and Cats

C.Tokitsukaze and Min-Max XOR

D.Tokitsukaze and Slash Draw

E and F.Tokitsukaze and Eliminate (easy)(hard)

G.Tokitsukaze and Power Battle (easy)

暂无

I.Tokitsukaze and Short Path (plus)

J.Tokitsukaze and Short Path (minus)

K.Tokitsukaze and Password (easy)


A.Tokitsukaze and Bracelet

阅读理解题,读懂题目按照要求模拟即可,重复的计算使用函数来解决

void solve(){int a,b,c; cin>>a>>b>>c;int ans=0;if(a==150) ans=1;if(a==200) ans=2;auto get = [&](int x){if(x>=29 && x<=32) return 0;if(x==45) return 2;return 1;};ans+=get(b)+get(c);cout<<ans<<endl;return ;
}

B.Tokitsukaze and Cats

我们要计算的是贡献,一个猫带来的贡献是看周围有没有其他的猫导致重复的所以我们就直接用

st[M][M]表示找个位置有没有猫然后看周围位置是不是有猫即可

bool st[M][M];
void solve(){cin>>n>>m>>k;int ans=0;while(k--){int a,b; cin>>a>>b;ans+=!st[a-1][b];ans+=!st[a+1][b];ans+=!st[a][b-1];ans+=!st[a][b+1];st[a][b]=true;}cout<<ans<<endl;return ;
}

C.Tokitsukaze and Min-Max XOR

1.记录方案数从数组中选一堆数出来的

2.与两个数异或<=k

接着分析我们可以发现选出这一堆数其实和整个数中有用的其实只有最大值和最小值,其他的都是看贡献即可

由此假设不考虑其他数的选择题目变成了选两个数异或小于等于k这也就是经典的trie树求解,但是考虑到树上的话,我们也是可以按照从小到大来排序不影响选择吗,同时保证到i的时候是最大值,那么贡献是什么呢贡献就是找到前面的一个满足的数后中间的数可选可不选2^{r-l-1}也就是\frac{2^{r-1}}{2^l}

也就是前面的数的贡献是后面的除以他那么我怎么记录前面的数的贡献呢?我们发现本题要的是逆元所以除以一个数可以变成乘以一个数的逆元由此 前缀可以用trie数+逆元的贡献来记录即可

然后就是普通的操作了

LL tr[N*32][2],cnt[N*32],idx;LL qmi(LL a,LL b){LL res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
LL inv(LL x){return qmi(x,mod-2);
}
void insert(int x,LL val){int p=0;for(int i=30;i>=0;i--){int u=x>>i&1;if(!tr[p][u]) tr[p][u]=++idx;p=tr[p][u];(cnt[p]+=val)%mod;}
}
LL query(int x,int y){int p=0;LL res=0;for(int i=30;i>=0;i--){int ux=x>>i&1,uy=y>>i&1;if(uy){res=(res+cnt[tr[p][ux]])%mod;if(!tr[p][!ux]) return res;p=tr[p][!ux];}else{if(!tr[p][ux]) return res;p=tr[p][ux];}}res=(res+cnt[p])%mod;return res;
}void intn(){for(int i=0;i<=idx;i++)for(int j=0;j<=1;j++)tr[i][j]=0,cnt[i]=0;idx=0;
}
void solve(){intn();cin>>n>>k;vector<int> a(n+1);for(int i=1;i<=n;i++) cin>>a[i];sort(a.begin()+1,a.end());LL ans=0;for(int i=1;i<=n;i++){(ans+=query(a[i],k)*qmi(2,i-1)%mod+1)%=mod;insert(a[i],inv(qmi(2,i)));}cout<<ans<<endl;return ;
}

D.Tokitsukaze and Slash Draw

典型的轮换变化我们可以直接抽象为图论,由于是最优解也就是最快抵达这个点的解把数和数之间的转化直接看成边即可,然后用dijkstra,由于要他排在第k张牌也就是抽走上面的n-k张牌符合边的要求接着就是初始的时候是0用map存边的最小值减少方案注意LL

void solve(){cin>>n>>m>>k;unordered_map<int,int> mp;for(int i=1;i<=m;i++){int x,y; cin>>x>>y;x%=n;if(!mp.count(x)) mp[x]=y;else mp[x]=min(mp[x],y);}int need=n-k;auto dijkstra = [&](){vector<bool> st(n+5);for(int i=1;i<=n;i++) d[i]=2e18;priority_queue<PII,vector<PII>,greater<PII>> q;q.emplace(0,0);while(!q.empty()){auto [cost,u]=q.top(); q.pop();if(st[u]) continue;st[u]=true;if(u==need) return cost;for(auto&[v,w]:mp){int ne=(u+v)%n;if(d[ne]>cost+w){d[ne]=cost+w;q.emplace(d[ne],ne);}}}return (LL)-1;};cout<<dijkstra()<<endl;return ;
}

E and F.Tokitsukaze and Eliminate (easy)(hard)

做题的时候特别是计算贡献的时候一定要找到贡献的来源,我们可以发现消除一个数(如果找个数在右边第一次出现)之后其最右边的数都会消失,那么怎么做的贡献最少呢,当然十当前数组的每一个数都出现的时候最优的这样的删除一次删除的数最多可以(j结论明显所以直接用map存书的数量即可然后删除)这种最优性贡献都是如此思考

1.贡献来源

2.如何减少贡献

3.贡献是否最优

int a[N];
void solve(){map<int,int> mp,cnt;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];cnt[a[i]]++;}int ans=0;for(int i=n;i>=1;i--){mp[a[i]]++;cnt[a[i]]--;if(mp.size()==cnt.size()){ans++;for(auto&[v,w]:mp){if(cnt[v]==0) cnt.erase(v);}mp.clear();}}cout<<ans<<endl;return ;
}

G.Tokitsukaze and Power Battle (easy)

本质上是一个线段树维护一个区间值

暂无

I.Tokitsukaze and Short Path (plus)

这是明显的计算贡献的题目我们看边的贡献是啥|a_v+a_u|+|a_v-a_u| = 2*max(a_u,a_v)

也就是说两个点之间的边贡献就是两个中的最大值的两倍,我们要计算的是\sum_i^n\sum_j^ndist_{i,j}

所以我们来看每一个点之间带来的贡献 如果直接抵达的话i和其他所有点的贡献是两者中的最大值

也就是一个点a和比他小的点的贡献就是dist_{a,i}=dist_{i,a}=a_i,同时简单思考两个点直接的最短路会不会中间有过度点,可以发现明显没有假设有的话可以简单论证一定比我现在找个要大,所以找个是最优的贡献,照权重由小到大排序之后sum=\sum_i^n2*a_i*(i-1)*2,注意开long long

void solve(){LL sum=0;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);for(int i=1;i<=n;i++){sum+=4*(LL)(i-1)*a[i];}cout<<sum<<endl;return ;
}

J.Tokitsukaze and Short Path (minus)

同上我们分析贡献dist_{u,v}=|a_u+a_v|-|a_u-a_v|=min(a_u,a_v)所以这次变成两个点中最小的了,但是如果直接同上一题是不是最优的呢?我们要考虑是否有中间点过度我们可以发现如果过度的是最小值a_1我们无法确定最优所以最优就是两者取最小值(也就是考虑齐全看我们的贡献是否是最优的) disti,j=min(2*a_1,min(a_i,a_j))

接着同上计算即可注意long long

int a[N];
void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);LL sum=0;for(int i=1;i<=n;i++){sum+=4ll*(n-i)*min(2*a[1],a[i]);}cout<<sum<<endl;return ;
}

K.Tokitsukaze and Password (easy)

首先我们读懂题目意思也就是我们需要的是 

1.没有前导0 

2.是8的倍数

3.<=y

4.其中的abcd字母是同字母数字相同不同字母数字不同(1-9),'-'只有一个也是1-9

数据范围1<=n<=9

首先我们可以发现整个数字的变化其实只有5^9所以我们可以考虑dfs直接暴力枚举所有情况即可

然后按照条件一个一个来

1. 特殊如果只有一个数可以为0,其他的如果有变化的话就是 从1开始,否则就是不满足要求

2&&3.由于数目较少到最后直接判断即可

4.(1)dfs枚举情况用map存储,同时st记录这个数是不是重复出现,同时记得还原现场

   (2)'-'直接枚举

   (3)枚举的同时需要满足没有前导0的要求

然后我们按照这个思考大纲书写代码即可

map<char,int> mp;
bool st[10];
void dfs(int u,LL res){if(u==n){if(res<=y && res%8==0) cnt++;return ;}if(s[u]>='0' && s[u]<='9'){if(s[u]=='0' && (!u && n!=1)) return ;dfs(u+1,res*10+(s[u]-'0'));}else if(s[u]=='_'){for(int i=(u==0 ? (n==1 ? 0 : 1) : 0);i<=9;i++){dfs(u+1,res*10+i);}}else{if(mp.count(s[u])) dfs(u+1,res*10+mp[s[u]]);else{for(int i=(u==0 ? (n==1 ? 0 : 1) : 0);i<=9;i++){if(st[i]) continue;mp[s[u]]=i;st[i]=true;dfs(u+1,res*10+i);st[i]=false;mp.erase(s[u]);}}}
}
void solve(){memset(st,0,sizeof st);mp.clear(); cnt=0;cin>>n>>s>>y;dfs(0,0);             cout<<cnt<<endl;return ;
}

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

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

相关文章

“智能语音指令解析“ 基于NLP与语音识别的工单关键信息提取

“智能语音指令解析“ 基于NLP与语音识别的工单关键信息提取 1. 背景介绍1.1 场景痛点1.2 方案选型 2. 准备开发环境3. PaddleSpeech 语音识别快速使用4. PaddleNLP 信息抽取快速使用5. 语音工单信息抽取核心功能实现6. 语音工单信息抽取网页应用6.1 网页前端6.2 网页后端6.3 a…

前后端项目宝塔linux部署(springboot,vue,python)

宝塔linux安装就省略了&#xff0c;网上一堆 1.部署后端 1.首先把自己项目里面打包好的的jar包上传到服务器随便一个地方&#xff0c;我这里就上传到www/wwwroot下面了&#xff0c;宝塔的文件页面可以很便携上传 2.然后到下面这个页面 选那个java环境管理装个jdk&#xff…

vue ts html 中如何遍历 Enum 类型构建页面结构

vue ts html 中如何遍历 Enum 类型构建页面结构 一、需求 定义了一个 Enum 用来标记菜单类型&#xff1a; enum EnumMenuType {目录 1,菜单,按钮,外链 }你得 Enum 知道它的序号是随第一个定义的值自动增长的 现在想在 ElementUI 界面的 radio-group 中遍历它&#xff0c;…

SINAMICS V90 指导手册 第2章 SD卡 功能列表 技术数据 惯量比

微型SD卡 该卡可用于拷贝驱动参数或者执行固件升级&#xff0c;需要注意的是&#xff0c;200V系列的伺服驱动&#xff0c;可以选择Kingston或SanDisk生成的高品质SD卡&#xff1b;而对于400V系列驱动&#xff0c;建议使用西门子的SD卡&#xff0c;订货号&#xff1a;6SL3054-4…

【element+vue】点击加号增加一行,点击减号删除一行

代码实现&#xff1a; 页面部分&#xff1a; vueelement 备注&#xff1a;v-if “i>0” &#xff08;保证第一行不出现减号&#xff09; <div v-for"(item,i) in studentList"><el-form-item label"学生:" prop"name"><el-i…

Jessibuca 插件播放直播流视频

jessibuca官网&#xff1a;http://jessibuca.monibuca.com/player.html git地址&#xff1a;https://gitee.com/huangz2350_admin/jessibuca#https://gitee.com/link?targethttp%3A%2F%2Fjessibuca.monibuca.com%2F 项目需要的文件 1.播放组件 <template ><div i…

【深入理解设计模式】适配器设计模式

适配器设计模式 适配器设计模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而使得原本由于接口不兼容而不能一起工作的类能够一起工作。适配器模式通常用于以下场景&#xff1a; 现有接口与需求不匹配&#xff1a;当需要…

【力扣 - 买卖股票的最佳时机】

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

【Linux深入剖析】进程优先级 | 命令行参数 | 环境变量

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.进程优先级2.Linux…

【MySQL面试复习】详细说下事务的特性

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

Unity(第六部)向量的理解和算法

标量:只有大小的量。185 888 999 &#xff08;类似坐标&#xff09; 向量:既有大小&#xff0c;也有方向。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米&#xff09; 向量的模:向量的大小。&#xff08;类似以个体为主体的方向&#xff0c;前方一百米、只取一百米…

Leetcoder Day23| 回溯part03:组合+分割

语言&#xff1a;Java/Go 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。 candidates 中的同一个…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的&#xff0c;有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关&#xff0c;区别就是如果最后的输出只和当前状态有关而与输入无关&#xff0c;则是moore型状态机。如果最后的输出不…

Go 如何按行读取(大)文件?尝试 bufio 包提供的几种方式

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十七篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 本文将介绍 Go 如何按行读取文件&#xff0c;基于此会逐步延伸到如何按块读取文件。 引言 我们将要介绍的按行读取文件的方式其实是非常适合…

Laravel04 eloquent

eloquent 1. eloquent2. 创建eloquent model 以及 取数据 1. eloquent 文档地址&#xff1a; https://learnku.com/docs/laravel/8.x/eloquent/9406 下面是我们&#xff0c;通过laravel的DB类从数据库中获取了post记录&#xff0c;那么有没有可能我们直接获取一个post对象&am…

pycharm控制STM32F103ZET6拍照并上位机接收显示(OV7670、照相机、STM32、TFTLCD)

基于STM32的照相机 准备工作最终效果一、下位机1、主函数2、OV7670初始化 二、上位机1、控制拍照2、接收图片数据 三、资源获取 准备工作 一、硬件及片上资源: 1,串口1(波特率:921600,PA9/PA10通过usb转ttl连接电脑&#xff0c;或者其他方法)上传图片数据至上位机 2,串口2(波特…

一文读懂:AWS 网络对等互连(VPC peering)实用操作指南

VPC peering connection-网络对等互连在您的 Atlas VPC 和云提供商的 VPC 之间建立私有连接。该连接将流量与公共网络隔离以提高安全性。本篇文章有VPC peering的操作指南以及价格等信息。如还有疑问请联系我们MongoDB的销售&#xff0c;客户成功经理或解决方案架构师。 1 使用…

【C之·预处理器】

系列文章目录 文章目录 前言一、预处理指令1. #line的用法1.1 概述 2. #error2.1 概述 二、预定义宏三、示例1. #line2. #error3. 预定义宏 总结 前言 C 预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C 预处理器只不过是一个…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

如何使用Douglas-042为威胁搜索和事件应急响应提速

关于Douglas-042 Douglas-042是一款功能强大的PowerShell脚本&#xff0c;该脚本可以提升数据分类的速度&#xff0c;并辅助广大研究人员迅速从取证数据中筛选和提取出关键数据。 该工具能够搜索和识别Windows生态系统中潜在的安全漏洞&#xff0c;Douglas-042会将注意力放在…