[考试记录] 2024.7.5

news/2024/10/6 3:46:41/文章来源:https://www.cnblogs.com/xiaolemc/p/18286707

T1 酸碱度中和

题目描述

小明有 \(n\) 瓶生理盐水,由于浓度不太一样, 以及混进来了一些奇怪的东西,第𝑖i瓶生理盐水的酸碱度是 \(a_i\)

小明觉得 \(n\) 个瓶子太多了,于是他决定把这 \(n\) 瓶盐水重新灌装进 \(k\) 个瓶子中。

把若干瓶盐水混到一起的前提条件是:每一瓶盐水的酸碱度是一样的。

这显然太困难了,所以小明准备去哆啦A梦的杂货铺购买道具“酸碱度修改器”。

“酸碱度修改器”有一个属性值 \(m\) ,当你使用它在某一瓶盐水上的时候,可以把这瓶盐水的酸碱度增加/减少最多 \(m\)。比如你有一个属性为 \(3\) 的“酸碱度修改器”,那么你可以把原来酸碱度为 \(4\) 的生理盐水的酸碱度修改为 \(1\),\(2\),\(3\),\(4\),\(5\),\(6\),\(7\) 中的任何一个值。

“酸碱度修改器”可以重复使用。但是,对于每一瓶生理盐水来说只能使用一次。

属性值 \(m\) 越大的“酸碱度修改器”越贵,因此,小明决定购买 \(m\) 尽量小的,请帮助小明算一算,他最少要买属性为多少的“酸碱度修改器”。

输入格式

第一行输入 \(n\),\(k\)

接下来一行输入 \(n\) 个正整数表示 \(a_i\)

输出格式

一个数字表示答案。

输入数据 1

4 2
1 3 5 7

输出数据 1

1

输入数据 2

4 1
1 3 5 7

输出数据 2

3

数据范围

对于30%的数据:\(𝑛≤20\)

对于50%的数据:\(n≤500\)

对于另外20%的数据:\(k=2\)

对于100%的数据:\(𝑛≤10^5,1≤𝑎𝑖≤10^9\)。 全部数据 \(k<=50000\)

解析

本场考试最大的失误,看到 \(1e5\) 没往二分那里想,先考虑的 DP,然后发现不可做,于是打暴力拿部分分。

正解 二分答案。可以先把序列从小到大排序,可以发现修改器的最大值即为 $\left \lceil \frac{s}{2} \right \rceil $,其中 \(S=a[n]-a[1]\) 代表极差。由于随着修改器数值的减小,整个序列分成的段数就越多,满足单调性。那么可以二分这个修改器的属性,看能否把序列分成 \(k\)​ 段即可。

#include<bits/stdc++.h>
using namespace std;
constexpr int N = 1e5 + 1;
int n, k, a[N];
inline bool check(int t){int cnt = 1, lst = 1, i = 1;while(i <= n)if(a[i] - a[lst] > t) ++cnt, lst = i;else ++i;return cnt<=k;
}
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>n>>k; if(k >= n) return cout<<'0', 0; for(int i=1; i<=n; ++i) cin>>a[i];sort(a+1, a+1+n);int l = 0, r = a[n]-a[1]+1;while(l < r){int mid = (l + r) >> 1;if(check(mid)) r = mid;else l = mid+1;} return cout<<(l+1>>1), 0;
}

T2 聪明的小明

题目描述

小明开了个酒厂,他的酒厂里面会出产 \(k\) 种酒。

有一天,市长要来他的酒厂视察,他可太高兴了。

为了应对这次视察,他决定在一个陈列长廊上摆放 \(n\) 瓶酒。市长走过这个长廊的时候就会看到每一瓶酒。

通过市长秘书处的打听,小明得到了一个重要消息:市长将会在考察完毕后,从长廊里面连续的取走 \(m\) 瓶酒作为纪念。

为了让市长带走的酒里,一定包含酒厂中产出的每一种酒,小明决定仔细研究这 \(n\) 瓶酒具体来摆放哪些酒。

请帮助小明算一算,他有多少种摆放酒的方案吧!

输入格式

第一行三个正整数 \(n\), \(k\) ,\(m\),如题所述。

输出格式

输出答案 \(\bmod 998244353\)

样例 #1

样例输入 #1

4 2 3

样例输出 #1

10

提示

【样例 1 解释】

一共1010种方案:

[1121],[1122],[1211],[1212],[1221],[2212],[2211],[2122],[2121],[2112]

样例输入 #2

10 4 6

样例输出 #2

81552

样例输入 #3

100000 7 10

样例输出 #3

77680521

数据范围

对于25%的数据:\(n≤20,k=2\)

对于另5%的数据:\(k=m\)

对于另20%的数据:\(k=2\)

对于另20%的数据:\(𝑚≤5\)

对于100%的数据:\(𝑚≤𝑛≤10^5,1≤𝑘≤𝑚≤10\)

解析

看到时一眼组合题,然后发现不可做。于是又打暴力大部分分。

部分分

其实当 \(k=m\) 时,总方案数为 \(k!\)

\(k=2\) 时,可用容斥原理求解,方案数为 \(2^n+\sum_\limits{i=1}^{n-m-2}2^{n-m+2-i}\times (n-m+2-i)\times (-1)^i\) (来自 dyk 大佬的推理,我不会)。

正解

对,没错,状压 DP。考虑其中一段 \(m\) 序列,假设 \(m=5\) , \(k=3\),于是有 \(11223\)\(12333\) 等等。可以发现 \(11223\)\(22113\)\(11332\) 的贡献是一样的,于是就可以只记录每种酒最后出现的位置 \(*1*23\),进一步 \(*1*23\)\(*2*13\) 是一样的,于是可简化为 01串 \(01011\)。看一眼范围 \(m\le 10\) 所以总共有 1<<10种状态,状态合法的条件是状态中 \(1\) 的数量等于 \(k\),并且最高位一定为 \(1\)。然后计算每种状态对应的 dp[m][s]。接下来就是递推操作。可以从初始状态 dp[m][s] 开始递推,对于每一次转移,考虑这个 01 串中哪一个 \(1\) 被替换到前面即可。例如 \(1100\) 可以从 \(1001\)\(1010\)\(1100\) 转移而来。复杂度 \(O(n2^m)\)

最后滚动数组优化。

#include<bits/stdc++.h>
using namespace std;
#define lb(x) (x&-x)
constexpr int M = 998244353, N = 1e5 + 1;
int n, k, m, dp[N][(1<<10)+1], ans;
vector<int> base, G[(1<<10)+1];
inline int get(int t){int ans = 1;for(int i=0, num=k; i<m; ++i){ans = (__int128)ans * num % M;if(t&(1<<i)) --num;} return ans;
}
int main(){ios::sync_with_stdio(0), cout.tie(0), cin.tie(0);cin>>n>>k>>m;for(int i=1<<(m-1); i<(1<<m); ++i){if(__builtin_popcount(i) == k){ // 统计有多少1base.push_back(i);dp[m][i] = get(i);}}for(int a : base) for(int b : base){for(int i=1, t=b; i<=k; ++i, t-=lb(t)){if((b-lb(t)+(1<<m))>>1 == a) { // 万能 lowbitG[a].push_back(b);break;}}}	for(int i=m+1; i<=n; ++i) for(int a : base) for(int b : G[a])dp[i][a] = (__int128)(dp[i][a] + dp[i-1][b]) % M;for(int a : base) ans = (__int128)(ans + dp[n][a]) % M;return cout<<ans, 0;
}

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

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

相关文章

Jitsi搭建流程

系统要求:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK)。安装好宝塔(需要用到https证书)、Nninx前置: sudo -i # 切换到 root 用户apt update -y # 升级 packagesapt install wget curl sudo vim git -y # Debian 系统比较干净,安装常用的软件 1:安装 Docker 环…

代码随想录算法训练营第五十三天 | 739.每日温度 496.下一个更大的元素I 503.下一个更大的元素II

739.每日温度 题目链接 文章讲解 视频讲解 单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素单调栈里存什么元素 只要存下标就可以了,比较元素时可以通过下标取元素 单调栈是单调增还是单调减(从栈顶到栈底) 使用单调增的单调栈解题步骤:遍历数组,当栈空时直…

积分中值定理的证明1

积分中值定理的证明如下:

24年读书清单

最近整理的读书清单,今年的读书就从里面挑选了;

【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错

问题描述 iOS Objective-C 应用,连接Azure Storage Account, 根据官网Example代码,在没有关闭Storage Account的匿名访问时,程序正常运行。但是,只要关闭了匿名访问,上传blob到Container中,就会报错:Public access is not permitted on this storage account 问题解答…

模拟集成电路设计系列博客——9.4 ESD保护单元

模拟集成电路设计 9.4 ESD保护单元 ESD,即electrostatic discharge(静电放电)是集成电路设计中的一个经典问题。通常在电路的生产和使用过程中,很容易由于各种原因积累大量的静电电荷,一旦产生静电放电,极高的静电电压(可能\(>1000V\))会对电路产生不可逆的破坏。因…

函数进阶应用1

Excel函数进阶VLOOKUP函数 返回多列结果 通过混合引用,match函数查找以及Vlookup函数,使用填充柄拖拽行列填充 操作演示:说明首先我们可以写一个普通的VLOOKUP函数通过match函数找到要填充的符合条件的内容所在单元格的位置在拖拽时,分析哪些需要绝对引用,哪些需要混合引用…

Linux学习前置,红帽Linux系统安装

前置: 下载:VMware Workstation Pro 17,以及所需要使用的Linux版本;安装VMware Workstation; 安装: 进入VMware后选择新建虚拟机: 选择Linux和red hat 9版本; 选择使用网络地址转换 接下来选择推荐的设置就好; 选择新建磁盘 虚拟机创建好后在设备一栏里单击CD/DVD(SAT…

C++:win11下的VScode构建百度Comate

一. VScode的安装官网下载地址:https://code.visualstudio.com/ (选择好对应的系统版本) 汉化:安装完软件后,打开软件界面的"扩展商店",搜索Chinese,下载相应的插件,如下图:二. 配置C++开发环境VSCode只是一个高级的编辑器,可以用来写C++代码,不能直接编译…

学习笔记(0):重拾Halcon

目录前言教学视频 前言 了解我的人可能知道,我其实很想回去全职做外贸,但是大环境不好,淘宝做了3个月,1688做了1个月。我只能说销量很惨淡。现在打算还是老老实实上班去了。 教学视频 我之前找一个B站UP主,买了一下他的教学视频。600块钱,总共有40集,大概10个小时。大概…

Golang channel底层是如何实现的?(深度好文)

Go语言为了方便使用者,提供了简单、安全的协程数据同步和通信机制,channel。那我们知道channel底层是如何实现的吗?今天k哥就来聊聊channel的底层实现原理。同时,为了验证我们是否掌握了channel的实现原理,本文也收集了channel的高频面试题,理解了原理,面试题自然不在话…

初识XML

一.XML概述XML,Extensible Markup Language,扩展性标识语言具体作用为:(1)可作为一种简单的数据库,存储并检索数据;(2)传输约定格式的文件;(3)做软件的配置文件。【配置文件:保存软件设置的文件】HTML和XML的区别:HTML标签不能自定义,XML标签只能自定义。 HTML语法要…