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.mzph.cn/news/705062.shtml

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

相关文章

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

CSS 入门手册(二)

目录 12-Overflow 13-下拉菜单 14-提示框 14.1 显示位置&#xff08;左右&#xff09; 14.2 显示位置(上下) 14.3 添加箭头 14.4 淡入效果 15-图片 16-列表 17-表格 17.1 表格宽度和高度 17.2 文字对齐 17.3 表格颜色 18-计数器 19-导航栏 19.1 导航栏UI优化 …

python第七节:条件、循环语句(2)

循环语句 while循环 for循环 组合嵌套循环 break 终止循环&#xff0c;跳出整个循环 continue 终止当前循环&#xff0c;进入下一次循环 pass 空语句&#xff0c;什么都不做&#xff0c;用于保持结构完整 语法1&#xff1a;whlie循环一定要控制好循环条件&#…

Python基础21 面向对象(4)进阶 类的一些内置方法和属性

文章目录 一、模块调用中attr类函数的运用1、执行模块以外的模块调用2、执行模块调用自己 二、\_\_getattribute__()方法的运行逻辑三、item系列方法四、\_\_str__()方法五、\_\_repr__()方法六、自定制格式化方法七、__slots__属性八、\_\_doc__属性九、__module__和__class\_…

pytorch -- torch.nn下的常用损失函数

1.基础 loss function损失函数&#xff1a;预测输出与实际输出 差距 越小越好 - 计算实际输出和目标之间的差距 - 为我们更新输出提供依据&#xff08;反向传播&#xff09; 1. L1 torch.nn.L1Loss(size_averageNone, reduceNone, reduction‘mean’) 2. 平方差&#xff08;…

axios的基本特性用法

1. axios的基本特性 axios 是一个基于Promise用于浏览器和node.js的HTTP客户端。 它具有以下特征&#xff1a; 支持浏览器和node.js支持promiseAPI自动转换JSON数据能拦截请求和响应请求转换请求数据和响应数据&#xff08;请求是可以加密&#xff0c;在返回时也可进行解密&…

如何在 VM 虚拟机中安装 Windows 7 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 没有安装 VM 虚拟机的参考以下文章进行安装&#xff1a; VM 虚拟机安装教程​编辑https://eclecticism.blog.csdn.net/article/details/135713915https://eclecticism.blog.csdn.net/article/details/135713915 二、Windows 7 镜像 点击链接…

大语言模型LLM参数微调:提升6B及以上级别模型性能(LLM系列009)

文章目录 大语言模型LLM参数微调&#xff1a;提升6B及以上级别模型性能&#xff08;LLM系列009&#xff09;序章LLM参数微调的核心原理预训练与微调过程技术细化 LLM参数微调实战案例详解案例一&#xff1a;文本分类任务微调案例二&#xff1a;问答系统任务微调案例三&#xff…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

cypher操作图数据库

简单示例 sql语法返回值 sql语法 在Match语法中&#xff0c;无法对关系使用$引入变量&#xff08;案例中的max_path_len&#xff09;。如果一定要引入&#xff0c;就使用format的字符串占位符方法。在Match语法中&#xff0c;允许对节点的属性使用$引入变量。如果sql已经使用了…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

数据结构知识点总结-特殊矩阵-矩阵的压缩存储

特殊矩阵 定义 矩阵在计算机图形学中占有很重要的地位。在数据结构中我们不研究矩阵的运算,而是侧重于如何将矩阵高效的存储在内存中,并能方便的提取矩阵中的元素。 数组的概念 数组是由n(n>=0)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每…

基于smilehappiness-framework-base,快速集成ShardingSphere JDBC

文章目录 1 前言2 分库分表2.1 什么是分库分表2.2 垂直分库2.3 水平分表 3 如何集成使用分库分表3.1 添加maven依赖3.2 添加 shardingSphere 数据源3.2 添加 sharding jdbc 配置3.2.1 分表配置示例3.2.2 分库且分表配置示例 1 前言 为什么使用分库分表&#xff1f;随着业务量的…

【Fastadmin】动态下拉(SelectPage)

目录 1.常规用法: 2.常用属性: 3.联动用法:三级分类为例 FastAdmin中的动态下拉列表使用的是优秀强大的Selectpage插件,FastAdmin对其进行了二次开发。 1.常规用法: <input id="c-name" data-rule="required" data-source="category/sele…

vue3_父组件调用子组件的某个方法

父组件&#xff1a; <template><div class"father"><el-button click"handle">触发子组件事件</el-button><child ref"children"/></div> </template><script setup lang"ts"> impo…

C# OpenCvSharp 颜色反转

目录 效果 灰度图 黑白色反转 彩色反转 项目 代码 下载 效果 灰度图 黑白色反转 彩色反转 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Te…

电机应用中的大功率电阻器?

在这篇文章中&#xff0c;我们将考虑电机应用中的电阻器。 交流、直流和专用电机用于广泛的应用。一些电机应用相对简单&#xff0c;唯一需要关注的是电机的启动和关闭。在这里&#xff0c;成本、简单性和可靠性是主要问题&#xff0c;而电机控制电阻器是常见的解决方案。 在…

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

解决:selenium web browser 的版本适配问题

文章目录 解决方案&#xff1a;使用 webdriver manager 自动适配驱动 使用 selenium 操控浏览器的时候报错&#xff1a; The chromedriver version (114.0.5735.90) detected in PATH at /opt/homebrew/bin/chromedriver might not be compatible with the detected chrome ve…

IK分词器

下载 elasticsearch&#xff1a;https://www.elastic.co/cn/elasticsearch elasticsearch-analysis-ik&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik 启动 elasticsearch&#xff1a;elasticsearch\bin\elasticsearch.bat http://localhost:9200 启动 kiban…