牛客周赛94

article/2025/6/22 19:42:42

随手写一下题解吧,最后一题确实有点烧脑了,一开始没想到,看完题解确实茅塞顿开了

经典校招题

思路:n级台阶,每次只能走1或2格,问你最少得步数,那肯定就是每次都走两个,如果是奇数就多走一个,否则就是整除

#include<bits/stdc++.h>
using namespace std;
int n;
signed main()
{cin>>n;cout<<n/2+(n%2==1);
}

小苯购物

思路:纯暴力把每种情况枚举一遍即可

#include<bits/stdc++.h>
using namespace std;
#define int long longvoid solve() {int n;cin >> n;int a[4], b[4];for(int i = 1; i <= 3; i++) {cin >> a[i] >> b[i];}int ans = n; int order[3] = {1, 2, 3};do {int current = n;for(int i = 0; i < 3; i++) {int coupon = order[i];if(current >= a[coupon]) {current = max(current - b[coupon], 0LL);}}ans = min(ans, current);} while(next_permutation(order, order + 3));cout << ans << "\n";
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t;cin >> t;while(t--) {solve();}return 0;
}

 小苯的与三角形

思路:这题其实很容易去联想位运算这个东西,众所周知,两个数的&一定会小于等于两个数之中最小的那一个,因此我们可以知道,如果y+x&y>x即可成立,那么也就是说我们的y&(y-1)都无法大于x的话,一定就是-1,否则的话,只要我们的x&y最小只需要是y的最大的那一位的1的位置,即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main() 
{int t;cin >> t;  while (t--) {int x;cin >> x;  if ((x & (x - 1)) == 0) {cout << -1 << endl;} else {cout << (1 << (31 - __builtin_clz(x))) << endl; }}return 0;
}

 小苯的序列染色

思路:这题其实和c题差不多都是有点考验思维,我们仔细分析一下发现,每次只能涂成110,并且初始的时候,所有数的数值都是0,因此我们可以知道,我们可以先把整个序列最左边连续的0丢掉,比如说001100,我们就可以看成1100,然后我们知道,最后一位肯定不可能是1,然后嘞,剩下的序列,第二个数绝对不可能是0,我们直接去实现上述思路即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
string s;void solve() {cin >> n;cin >> s;if (s[n - 1] != '0') {cout << "NO" << endl;return;}int j = 0;while (j < n && s[j] == '0') {j++;}if (j + 1 < n && s[j + 1] == '0') {cout << "NO" << endl;return;}cout << "YES" << endl;
}signed main() {int T = 1;cin >> T;while (T--) {solve();}return 0;
}

 小苯的数字操作

思路:这题怎么说呢?我们只有两种操作,乘二和除二,那么我们考虑那种情况更特殊呢?好吧,其实都很特殊,只有奇数乘二会出现过程中不会出现的东西,只有奇数除二才会导致丢失一个1

众所周知,我们只有k次操作机会,算上一开始的数,如果全是乘法操作的话,也就是说会有k+1种情况了现在,那么我们只需要去遍历k种操作或者说等n变成1被除成0的时候结束操作即可,我们只需要在n变成奇数的时候去加上剩余的次数了并且这个奇数不为1,是1直接加1即可,偶数就直接+1

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
void solve()
{cin>>n>>k;int ans=k+1;while(n&&k){if(n%2==1){if(n==1)ans+=1;elseans+=k;}else{ans+=1;}n/=2;k--;}cout<<ans<<"\n";
}
signed main()
{cin>>t;while(t--){solve();}return 0;
}

 小苯的小球分组

题意:我们先来说一下题意吧,防止到时候绕迷糊了,就是说有n个小球,每个小球都有自己的颜色,然后给你一个定义f(X)表示对于X这个序列, 满足两个条件的最小分组,第一个是每个组内最多有俩球,第二个是每个组内的球的颜色不能相同,求出所有子序列的最小分组个数之和

思路:我们首先首先来考虑两种情况

第一种是,第一组有5个球,第二组有3个球,第三组有3个球,问你最少分多少组,那么我们从谈心的角度来考虑,尽可能多的将两个异色球放在一起,所以第一组和第一组先配对三个,然后剩下的就是第一组的两个和第三组的两个配对,最后剩下一个第三种颜色的球,我们发现这种就相当于球的总个数除二去向上取整

第二种是第一组有五个球,第二组和第三组各有两个球,俺们我们的配对方式就是第一组和第二组配对两个,第一组和第三组配对两个,我们就会发现,这样的分组数,其实就是最多的球的颜色出现的个数

但是我们现在想要求出来总个数,该怎么办呢?

我们能否假设,所有子序列都是满足第一种情况的,球的总个数/2向上取整,答案是肯定的,那么我们可以用组合数的公式去求我们假设情况下总共的个数应该为

(len+1)/2*C(n,len);我们的len表示的是当前序列的长度,len直接去遍历1到n即可

这样我们就找到了所有情况下的个数总和

那我们知道有些是假设的肯定不可能是真的啊,那部分该怎么去求呢?

我们在这里去引入一个绝对众数的概念
什么是绝对众数呢?就是说当前的我们当前的众数的出现次数,要超过其余元素的出现的次数的累加和

好了解释完这个概念我们继续往下讨论,我们会发现,其实对于绝对众数的这个概念,也就是我在上面列举的第二种情况,所以我们可以去考虑枚举绝对众数,我们用一个三层循环,最外层循环式遍历的颜色,第二层循环是遍历当前颜色出现的次数,我们将第二层变成我们子序列的绝对众数即可,第三层循环,我们去遍历其余元素出现的次数,其余元素的出现次数应当小于绝对众数并且小于等于剩下的元素个数

然后我们来考虑要减掉什么,加上什么

首先就是减掉的是我们假设的那部分为子序列长度/2向上取整的那部分可能出现的子序列次数为

(j+k+1)/2*C(cnt[i],j]*C*(n-cnt[i],k)即可

那么我们加上的是什么
(j+1)/2*C(cnt[i],j]*C*(n-cnt[i],k)即可

然后就是写代码了,思路确实有点小复杂,但是学完会有好处的

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define LL long long
int t;
int n;
int x;
int mod=998244353;
int f[5005];
int inv[5005];
int fast(int a,int b)
{int base=1;while(b){if(b%2==1){base=(base*a)%mod;}a=(a*a)%mod;b/=2;}return base;
}
int C(int n,int m)
{return (f[n]*inv[m])%mod*inv[n-m]%mod;
}
void solve(){cin>>n;unordered_map<int,int> mp;for(int i=1;i<=n;i++){cin>>x;mp[x]++;}int num=mp.size();vector<int> cnt;for(auto t:mp){cnt.push_back(t.second);}int ans=0;for(int i=1;i<=n;i++){ans=(ans+(i+1)/2*C(n,i)%mod)%mod;}for(int i=0;i<num;i++){for(int j=1;j<=cnt[i];j++){for (int k = 0; k < j && k <= (n - cnt[i]); k++){int len=k+j;int del=(len+1)/2*C(n-cnt[i],k)%mod*C(cnt[i],j)%mod;int add=j*C(n-cnt[i],k)%mod*C(cnt[i],j)%mod;ans=(ans-del+add+mod)%mod;}}}cout<<ans<<"\n";
}
signed main()
{int flag=1;f[0]=1;inv[0] = 1;  for(int i=1;i<=5000;i++){flag=(flag*i)%mod;f[i]=flag;}inv[5000]=fast(f[5000],mod-2);for(int i=4999;i>=0;i--){inv[i]=inv[i+1]*(i+1)%mod;}cin>>t;while(t--)solve();return 0;
}


http://www.hkcw.cn/article/AblBZpgwqZ.shtml

相关文章

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…

流媒体基础解析:视频清晰度的关键因素

在视频处理的过程中&#xff0c;编码解码及码率是影响视频清晰度的关键因素。今天&#xff0c;我们将深入探讨这些概念&#xff0c;并解析它们如何共同作用于视频质量。 编码解码概述 编码&#xff0c;简单来说&#xff0c;就是压缩。视频编码的目的是将原始视频数据压缩成较…

TDengine 集群运行监控

简介 为了确保集群稳定运行&#xff0c;TDengine 集成了多种监控指标收集机制&#xff0c;并通过 taosKeeper 进行汇总。taosKeeper 负责接收这些数据&#xff0c;并将其写入一个独立的 TDengine 实例中&#xff0c;该实例可以与被监控的 TDengine 集群保持独立。TDengine 中的…

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!

摘要&#xff1a;人类的认知通常涉及通过抽象、灵活的概念进行思考&#xff0c;而不是严格依赖离散的语言符号。然而&#xff0c;当前的推理模型受到人类语言边界的限制&#xff0c;只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…

【LUT技术专题】图像自适应3DLUT

3DLUT开山之作: Learning Image-adaptive 3D Lookup Tables for High Performance Photo Enhancement in Real-time&#xff08;2020 TPAMI &#xff09; 专题介绍一、研究背景二、图像自适应3DLUT方法2.1 前置知识2.2 整体流程2.3 损失函数的设计 三、实验结果四、局限五、总结…

【计算机网络】 ARP协议和DNS协议

文章目录 【计算机网络】ARP协议和DNS协议&#xff08;知识点详细&#xff09;一、ARP协议&#xff08;地址解析协议&#xff09;1. **协议功能**2. **ARP报文结构**3. **工作流程**&#xff08;1&#xff09;**正向ARP&#xff08;已知IP&#xff0c;求MAC&#xff09;**&…

普中STM32F103ZET6开发攻略(一)

各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 目录 普中STM32F103ZET6开发攻略 1. GPIO端口实验——点亮LED灯 1.1 实验目的 1.2 实验原理 1.3 实验环境和器材…

Azure DevOps 管道部署系列之二IIS

本博客旨在提供如何使用 Azure DevOps YAML 管道部署到虚拟机上的 IIS 的实用指南。 开始之前,您需要做好以下准备: 您拥有要部署的服务器的访问权限以及 PowerShell 的管理员访问权限。您拥有要部署的远程服务器的互联网访问权限。您拥有在服务器上安装 .NET Core 托管包的…

Linux命令之ausearch命令

一、命令简介 ausearch 是 Linux 审计系统 (auditd) 中的一个实用工具,用于搜索审计日志中的事件。它是审计框架的重要组成部分,可以帮助系统管理员分析系统活动和安全事件。 二、使用示例 1、安装ausearch命令 Ubuntu系统安装ausearch命令,安装后启动服务。 root@testser…

2025山东CCPC题解

文章目录 L - StellaD - Distributed SystemI - Square PuzzleE - Greatest Common DivisorG - Assembly Line L - Stella 题目来源&#xff1a;L - Stella 解题思路 签到题&#xff0c;因为给出的字母不是按顺序&#xff0c;可以存起来赋其值&#xff0c;然后在比较。 代码…

复数三角不等式简介及 MATLAB 演示

复数三角不等式简介及 MATLAB 演示 1. 复数三角不等式简介 复数三角不等式&#xff08;Complex Triangle Inequality&#xff09;是复数的一种重要性质&#xff0c;它类似于普通的三角不等式&#xff0c;但适用于复数空间。具体来说&#xff0c;复数三角不等式可以描述复数之…

学术合作交流

想找志同道合的科研小伙伴&#xff01;研究方向包括&#xff1a;计算机视觉&#xff08;CV&#xff09;、人工智能&#xff08;AI&#xff09;、目标检测、行人重识别、行人搜索、虹膜识别等。欢迎具备扎实基础的本科、硕士及博士生加入&#xff0c;共同致力于高质量 SCI 期刊和…

2025-05-31 Python深度学习10——模型训练流程

文章目录 1 数据准备1.1 下载与预处理1.2 数据加载 2 模型构建2.1 自定义 CNN 模型2.2 GPU加速 3 训练配置3.1 损失函数3.2 优化器3.3 训练参数 4 训练循环4.1 训练模式 (model.train())4.2 评估模式 (model.eval()) 5 模型验证 本文环境&#xff1a; Pycharm 2025.1Python 3.1…

十五、STM32的TIM(六)(PWM驱动舵机)

介绍&#xff1a;本章节主要讲解如何在 STM32C8T6 上使用 PWM 驱动舵机。通过按键输入控制&#xff0c;输出以 PWM 信号调整舵机转动角度&#xff0c;从而实现对舵机的精准控制。 目录 一、接线图 二、相关参数的计算 三、相关代码的编写 四、程序现象 一、接线图 二、相关…

C语言指针完全指南:从入门到精通(上)

目录 一、内存和指针 1.1 指针的使用场景 二、指针变量和地址 2.1 取地址符(&) 2.2指针变量和解引用操作符(*) 2.2.1 指针变量 2.3 指针变量的大小 三、指针变量类型的意义 3.2 指针-整数 ​编辑 四、指针计算 五、const修饰指针 5.1 const修饰变量 1.2 const修饰…

Kafka数据怎么保障不丢失

在分布式消息系统中&#xff0c;数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略&#xff0c;并附示意图辅助理解。 一、生产者端&#xff1a…

Win10秘笈:两种方式修改网卡物理地址(MAC)

Win10秘笈&#xff1a;两种方式修改网卡物理地址&#xff08;MAC&#xff09; 在修改之前&#xff0c;可以先确定一下要修改的网卡MAC地址&#xff0c;查询方法有很多种&#xff0c;比如&#xff1a; 1、在设置→网络和Internet→WLAN/以太网&#xff0c;如下图所示。 2、在控…

Angularjs-Hello

1 关于Angularjs 最近因为项目需要又要做这个&#xff0c;所以简单复习下。其实这个大概7&#xff0c;8年前就用过&#xff0c;当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度&#xff0c;本来以为早死在 沙滩上了&#xff0c;没想到现在还在坚…

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式&#xff1a; 红外LED波长&#xff1a; 通信协议标准&#xff1a; 2.硬件电路 发送部分1&#xff1a; 内部元件介绍&#xff1a; 工作原理&#xff1a; 为什么要以38KHZ亮灭&#xff1f; 电路图&#xff1a; 发送部分2&#xff1a; 电…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1&#xff1a;不确定行数和列数情况2&#xff1a;已知行数和列数情况3&#xff1a;已知行数但不知道列数情况4&#xff1a;已知列数但不知道行数 题目描述 解答&#xff1a;用队列 思路都差不多&#xff0c;我觉得对于我自己来说&a…