牛客 小白108 20250117

news/2025/1/20 19:17:34/文章来源:https://www.cnblogs.com/dianman/p/18682366

牛客 小白108 20250117

牛客小白月赛108_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

A:

题目大意:给定 \(x,y\) 第奇数次操作可以得到 \(1\) ,第偶数次操作可以得到 \(x\) ,求多少次操作后可以达到 \(y\)

#include <iostream>
using namespace std;int x, y;
bool judge(int op) {int sum = (op / 2 + op % 2) + (op / 2) * x;if (sum < y) return 1;else return 0;
}int main()
{int T;cin >> T;while (T--){cin >> x >> y;int l = -1, r = 2e9 + 1;while (l + 1 != r){int mid = l + r >> 1;if (judge(mid))l = mid;elser = mid;}cout << r << endl;}
}

二分操作数,通过下面的公式计算总数

\[sum=\frac{op}{2}*1+\frac{op}{2}*x +op\%2 \]

\(op\%2\) 作用为如果操作数为奇数时,那么需要额外加 $1 $

B:

题目大意:给定一个正整数,可以对这个数进行重新排列,问这个数重新排序后能否被 \(4\) 整除

#include <iostream>
#include <cstring>
#include <string>
using namespace std;void solve(void) {string s;int m[10];memset(m, 0, sizeof m);cin >> s;if (s.size() == 1) {if ((s[0] - '0') % 4 == 0) {cout << "YES" << endl;return;}else {cout << "NO" << endl;return;}}for (int i = 0; i < s.size(); i++)m[s[i] - '0']++;for (int i = 1; i <= 9; i++) {if (m[i]) {m[i]--;for (int j = 1; j <= 9; j++) {if (m[j] && (i * 10 + j) % 4 == 0) {cout << "YES" << endl;return;}}m[i]++;}}cout << "NO" << endl;return;
}int main() {int T;cin >> T;while (T--)solve();return 0;
}

能被 \(4\) 整除的数满足的性质是:后两位数组成的十位数能被 \(4\) 整除

使用 string 读入整数,数组模拟桶存储每个数出现的次数,特别地需要判断 s 只有一个数的情况

两层 for 循环枚举满足条件的十位数,每次枚举十位上的数时,应当在桶中把它出现的次数减去(不能重复选)

最后判断这个十位数能否被 \(4\) 整除即可

C:

题目大意:给出一组元素,对元素进行分组,求满足条件的最小分组数

\[c_1 \oplus c_2\oplus \dots\oplus c_m \ne 0 \\ lcm(c_1,c_2,\dots,c_m)+c_1 \oplus c_2\oplus \dots\oplus c_m=2\times\min(c_1,c_2,\dots,c_m) \]

#include <iostream>
#include <map>
#include <string>
using namespace std;void solve(void) {map<int, int> m;int n, c;int res = 0;cin >> n;while (n--){cin >> c;m[c]++;}for (auto &[k,v] : m) res += 2 - v % 2;cout << res << endl;return;
}int main() {int T;cin >> T;while (T--)solve();return 0;
}

数学题:

\[lcm(c_1,c_2,\dots,c_m)+c_1 \oplus c_2\oplus \dots\oplus c_m=2\times\min(c_1,c_2,\dots,c_m) \]

其中的最小公倍数可以转化为

\[lcm(c_1,c_2,\dots,c_m) =k*\min(c_1,c_2,\dots,c_m) \]

两边处理后可以得到

\[c_1 \oplus c_2\oplus \dots\oplus c_m=(2-k)\times \min(c_1,c_2,\dots,c_m) \]

又因为异或的结果不能为负,且 \(k>0\) ,结合第一个约束条件可以得出

\[c_1 \oplus c_2\oplus \dots\oplus c_m=\min(c_1,c_2,\dots,c_m) \]

所以每个组里面的元素都是相同的,由于 \(a\oplus a=0,a\oplus a\oplus a=a\)

可以作出这样的结论:每组里面的元素都是相同的,并且元素数为奇数(每个偶数都能分解为两个奇数之和)

res += 2 - v % 2

计算相同的元素分组后对答案的贡献,如果元素数为奇,贡献就是 \(1\) ,如果元素数为偶,贡献就是 \(2\)

PS:map的遍历——结构化绑定

for (auto &[key, val] : _map) {}

for 循环内使用 [key, val] 的方式进行键值对遍历,其中的 key 变量对应 _map 的键,val 变量对应 _map 映射出来的值

使用 & 避免拷贝数据,加速遍历

D:

题目大意:给定一个正整数 \(m\) 构造一个序列,序列中的数之和等于 \(m\)\(t_i\) 表示该序列中等于 \(i\) 的元素个数,求 \(mex\{t_1,t_2,\dots,t_n\}\)\(mex\) 定义为没有出现在序列内的最小非负整数

#include<bits/stdc++.h>using namespace std;long long m;
bool judge(__int128 v){__int128 sum=(v+1)*(v+1)*v/2-v*(v+1)*(2*v+1)/6;if (sum<=m) return 1;else return 0;
}int main()
{int T;cin>>T;while (T--){cin>>m;long long l=-1,r=1e7+1;while (l+1!=r){__int128 mid=l+r>>1;if (judge(mid))l=mid;elser=mid;}cout<<r<<endl;}return 0;
}

通过贪心可以直到,能够构造出和为 \(m\) 的序列的方式有两种

  • 只需要满足 \(mex\) 序列里面的 \(t_i\) 由小到大递增,构造的序列中有 \(i\)\(i\) ,从 \(i=1\) 开始
  • 只需要满足 \(mex\) 序列里面的 \(t_i\) 由小到大递增,构造的序列中有 \(k\)\(1\)\(k-1\)\(2\)

则对于给定规则序列,我们可以通过以下公式计算出序列元素和

\[sum_1=\sum_{i=1}^{k}i^2=\frac{k(k+1)(2k+1)}{6} \\ \implies sum_1=\frac{2k^3+3k^2+k}{6} \]

\[sum_2=\sum_{i=1}^{k}i*(k-i+1)=\frac{(1+k)k^2}{2}-\frac{k(k+1)(2k+1)}{6}+\frac{(1+k)k}{2} \\ \implies sum_2=\frac{k^3+3k^2+2k}{6} \]

可以看出,第二个规则构造出的序列元素和最小

即在相同的 \(m\) 下,第二个规则可能会得到更大的 \(t_i\) ,相应的 \(mex\) 也会更大

最后二分答案即可,注意溢出问题,使用 __int128 计算 \(k^3\)

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

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

相关文章

Centos根目录扩容

CentOS磁盘在根目录下扩容(无卷组情况下)查看磁盘分区情况,sda3挂载在根目录下,新扩容增加的sda4挂在在/data下现在想把sda4同样挂载在根目录下解决方法:删除sda3,再重建sda3(注意:删除后不要退出,紧接着重建,注意重建后的起始位置) 删除sda3然后重建输入下面那个命…

U455764 The Rotation Game

U455764 The Rotation Game 题目理解 本题要求移动\(A-H\)中的一列或一行,使其整个一行和一列的数字移动,使最后的中间8个的数字相同。求最少需要移动的步数和它的操纵顺序思路 1.本题可以很显然的想到用 \(BFS\) 来枚举执行不同字母操作后结果,但每 \(BFS\) 一次就会增加八…

BUU SQL COURSE 2

BUU SQL COURSE 2 BUU SQL COURSE 2 和前面那题差不多,但是注一下找到的登录成功但是显示 fault。 注一下别的看一下,在另一个数据库里找到了 flag。本文来自博客园,作者:Maplisky,转载请注明原文链接:https://www.cnblogs.com/lbh2021/p/18682313

PotPlayer 配置安装

目录一、下载1、官网链接2、微软商店 Microsoft Store二、安装1、双击安装包2、选择字体3、安装向导下一步4、接收许可协议5、选择组件及关联6、选择安装位置7、硬解选项三、设置1、关闭自动更新2、左键单双击设置3、视频下自动隐藏3.1、效果对比4、播放信息显示设置4.1、效果5…

2024年春秋杯网络安全联赛冬季赛部分wp

部分附件下载地址: https://pan.baidu.com/s/1Q6FjD5K-XLI-EuRLhxLq1Q 提取码: jay1 Misc day1-简单算术 根据提示应该是异或下载文件是一个字符串,写个代码字符串异或解密,由于需要密钥,所以先对单字节密钥进行爆破解密 爆破出flag代码如下: cipher_text = "ys~xdg/…

大夏龙雀DX-WF25(ESP32C2)蓝牙WIFI模块试用体验

模块尺寸跟引脚兼容常见的ESP8266 12-F模块,使用非常简单,vcc接3.3v,gnd接地,rx连接ch340的tx,tx连接ch340的rx即可。 如果需要通过urat下载程序,只需要把io9的引脚接地就行(下载完程序记得断开io9跟gnd的连接,否则程序无法运行)。芯片用的是ESP32C2(ESP8684),很遗…

1.20 前端连接数据库

今天完成了项目的网页前端与后端数据库的连接,已经能够将前端填写的内容添加到mysql数据库 例如页面如下:数据库内容:明天开始编写下一个功能

【vjudge训练记录】大一寒假专项训练——枚举算法

训练情况A题 给定 \((x,y)\),倒着枚举地毯的范围是否覆盖 \((x,y)\),如果覆盖直接输出,如果全部枚举完都没有则输出 -1点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){int n; cin>>n;int x[…

Khepri C2 framework beacons记录(之前的)

1、背景 在查看进程时发现可疑隐藏进程,名称为.test(.test.93627),隐藏文件,很可疑,于是查了下进程日志发现如下:/private/tmp/.test /private/var/db/oah/4b8f81eadefb42da07e9e88fa7905df57faec82d8621008e0ae4a04d81e2169f/bb9595accf35a51de80f42e656bdb2217238af58…

(重要***)查询自己需要的SQL语句

凡是指标相关的,先清空相关干扰条件,然后点击确认,比如加载性能里的列表页面,要查慢加载次数这个指标这个时候去这个数据库 写SQL语句select* fromquery_log ql whereql.user_name = sheng.yu-n@msxf.com order byexec_time desc limit 50然后找到自己对应操作的SQL 通过结…

最强截图录屏工具ShareX v17.0.0 中文绿色版

软件介绍 ShareX 是一款功能强大的屏幕截图和屏幕录制工具,可用于创建高质量的屏幕截图、动画 GIF 和屏幕录像,并提供多种上传选项,使用户能够轻松地将它们共享到互联网上。除此之外,它还支持多种自定义功能,例如图像编辑、颜色拾取、OCR 文字识别等。软件功能快速截图:简…

动态可视化:一步步拆解LSTM和GRU

转自:https://zhuanlan.zhihu.com/p/47907312 编者按:关于LSTM,之前我们已经出过不少文章,其中最经典的一篇是chrisolah的《一文详解LSTM网络》,文中使用的可视化图片被大量博文引用,现在已经随处可见。但正如短视频取代纯文字阅读是时代的趋势,在科普文章中,用可视化取…