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基础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;…

如何在 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 镜像 点击链接…

C++:类与对象(2)

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

【论文笔记之 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_…

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;但这是在内存…

AutoSAR(基础入门篇)11.5-服务映射(自顶向下)

目录 一、配置Service Needs 二、配置Cfg同步 我们在下一节的实验课中讲解这里的具体配置流程,本节主要讲一下这些配置的大致流程和配置项的作用。NvBlockSwComponents是一个可选项, 我们这里开始不使用NvBlockSwComponents,将我们的Application SWC直接和NvM通过C/S连接起…

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

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

SQL-Labs靶场“29-31”关通关教程

君衍. 一、二十九关 基于错误的WAF单引号注入1、源码分析2、HTTP参数污染3、联合查询注入4、updatexml报错注入 二、三十关 基于错误的WAF双引号注入1、源码分析2、联合查询注入3、updatexml报错注入 三、三十一关 基于错误的WAF双引号括号注入1、源码分析2、联合查询注入3、up…

【JavaEE】_前端使用GET请求的queryString向后端传参

目录 1. GET请求的query string 2. 关于query string的urlencode 1. GET请求的query string 1. 在HttpServletRequest请求中&#xff0c;getParameter方法用于在服务器这边获取到请求中的参数&#xff0c;主要在query string中&#xff1b; query string中的键值对都是程序…

C#中的关键字params的用法

C#中有一个关键字params&#xff0c;它相对于一些主要关键字来说&#xff0c;还算是较为低频的&#xff0c;但也会用到。我们可以了解和学习下。 一、定义及约束 params关键字的作用在于可以让方法参数的数目可变。 params的参数类型必须是一维数组。 一旦在方法加入了para…

C++ list详解以及模拟实现

目录 1.list的使用 1.1list的定义 1.2list的使用 1.3list iterator使用 1.4list capacity 1.5list element access 1.6list增删查改 2.list迭代器失效问题 3.list的模拟实现 1.list的使用 1.1list的定义 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容…

240Hz高刷电竞显示器 - HKC VG253KM

&#x1f389;&#x1f389;&#x1f389; 各位电竞爱好者们&#xff0c;今天给大家带来一款神秘武器&#xff0c;一款能够让你在游戏中大展拳脚的高刷电竞显示器 - HKC VG253KM&#xff01;&#x1f525;&#x1f525;&#x1f525; 这款显示器&#xff0c;哎呀&#xff0c;真…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

Vue笔记(一)

常用指令 1.v-show与v-if底层原理的区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个V…