题解:CF1954D(Colored Balls)

题解:CF1954D(Colored Balls)

CF1954D,是 CodeForces 难得一见的“非多测”题目,我们来看一下。

题意简述:有 n n n不同的球,第 i i i 种球有 a i a_i ai 个( 1 ≤ i ≤ n 1\leq i\leq n 1in)。对于每一种球,我们都可以选择“”或者“不用”,因此我们最终会有 2 n 2^n 2n 种不同的选法。对于每种选法,都有一个对应的权值,定义如下:将这些球分成 k k k 份,每一份的数量不大于 2 2 2 且不小于 1 1 1,使得每一份中的球种类不同(如果是两个球,要求它们种类不同;如果是一个球,就无所谓了),权值即为能达成的最小 k k k

观察数据范围, 1 ≤ n ≤ 5000 1\leq n\leq5000 1n5000 ∑ a ≤ 5000 \sum a\leq5000 a5000,显然这题是一道 O ( n ∑ a ) O(n\sum a) O(na) 的题。

既然它要我们求权值,那我们就思考:怎样快速算出一种选法的权值呢?

对题面中的要求用“白话文”解释一下,就是尽量让更多种类不同的球两两搭配剩下的都是一种相同的球,只能孤独终老。因此,最后剩下的相同的那些一定是数量最多的那一种。因此我们分情况讨论:

设这种选法总共有 m m m 种球,其中第 i i i 种有 b i b_i bi 个( 1 ≤ i ≤ m 1\leq i\leq m 1im),且 max ⁡ i = 1 m b i = b 1 \max_{i=1}^m b_i=b_1 maxi=1mbi=b1

  • ∑ i = 2 m b i ≤ b 1 \sum_{i=2}^mb_i\leq b_1 i=2mbib1 时,我们可以将其他种类 ∑ i = 2 m b i \sum_{i=2}^mb_i i=2mbi 个球与第 1 1 1 种(共有 b 1 b_1 b1 个)中的 ∑ i = 2 m b i \sum_{i=2}^mb_i i=2mbi 进行搭配剩下的第 1 1 1 种球单独分配。权值为 b 1 b_1 b1

  • ∑ i = 2 m b i > b 1 \sum_{i=2}^mb_i>b_1 i=2mbi>b1 时,刨去奇偶性因素,最终一定不会有单独分配的,因此最终权值为 ⌈ ( ∑ i = 1 m b i ) ÷ 2 ⌉ \lceil(\sum_{i=1}^m b_i)\div 2\rceil ⌈(i=1mbi)÷2

于是,求最大值 b 1 b_1 b1)和其余一堆数的总和 ∑ i = 2 m b i \sum_{i=2}^mb_i i=2mbi)就是这里面唯一耗时严重的部分,我们可以考虑将数组 a a a 从小到大排序,然后 for 一遍每一种,用变量 s u m sum sum 来记录一下目前为止的总和。顺着这个思路,我们再去考虑如何去求答案——当然是基于以上两种情况。于是,我们定义 f i f_i fi 表示目前为止不算当前的这一种球)能使得取的球的总数为 i i i总方案数,那么,对于第一种情况( 1 ≤ j ≤ a i 1\leq j\leq a_i 1jai),对答案的贡献是 f[j]*1LL*a[i];同理,对于第二种情况,对答案的贡献是 f[j]*1LL*((j+a[i]+1)/2)(常用技巧: a ÷ 2 a\div2 a÷2 向上取整可以处理成 (a+1)/2)。对于数组 f f f 的维护,我们就用类似于背包的策略,从大状态到小状态枚举,每次用 j − a i j-a_i jai 的状态去更新 j j j 的状态。

给个代码:

#include<bits/stdc++.h>
#define N 5500
#define S 5500
using namespace std;
const int _p=998244353;
int n,a[N];
int f[S],ans,sum;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	sort(a+1,a+1+n);
	f[0]=1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=sum;j++){
			if(j<=a[i])ans+=(f[j]*1LL*a[i])%_p;
			else ans+=(f[j]*1LL*((j+a[i]+1)/2))%_p;
			ans%=_p;
		}
		sum+=a[i];
		for(int j=sum;j-a[i]>=0;j--)f[j]=(f[j]+f[j-a[i]])%_p;
	}
	printf("%d\n",ans);
	return 0;
}

注意
在维护数组 f f f 的时候一定要注意不要减着减着就出负数状态了;
中间计算要开 long long 并取模。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Hugging Face】编写 shell 脚本在 huggingface 镜像站快速下载模型文件

前言 我们使用 Git LFS 和 wget 结合的方法&#xff0c;小文件使用 Git 下载&#xff0c;大文件使用 wget 下载 Git 下载的优缺点&#xff1a; 优点&#xff1a;相当简单 缺点&#xff1a;不支持断点续传 直接 wegt 下载比较稳定&#xff0c;但是欠缺优雅 我们可以将这两…

快速找出存(不存在)在某个(或多个)文件的文件夹

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 想要找出有下面这个文件存在的文件夹 切换到批量文件复制版块&#xff0c;快捷键Ctrl5 右侧&#xff0c;搜索添加 选定范围&#xff0c;勾选搜索文件夹、包…

表空间的创建

目录 表空间创建的语法 表空间创建的例子 创建一个永久性表空间&#xff0c;设置表空间初始大小为100MB&#xff0c;自动扩展为 100MB&#xff0c;无最大大小限制&#xff0c;并且该表空间为在线状态&#xff0c;产生日志 创建一个永久性表空间&#xff0c;通过本地化管理方…

Partisia Blockchain 生态首个zk跨链DEX现已上线

在5月1日&#xff0c;由Partisia Blockchain与zkCross创建合作推出的Partisia zkCrossDEX在Partisia Blockchain生态正式上线。Partisia zkCrossDEX是Partisia Blockchain上重要的互操作枢纽&#xff0c;其融合了zkCross的zk技术跨链互操作方案&#xff0c;并利用Partisia Bloc…

北邮22级信通院DSP:实验三(1):FFT变换、IFFT变换(附每步8点变换蝶形图)保姆级讲解+用C++程序实现复数域的FFT变换和IFFT变换

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 目录 一、预备知识 1.1 FFT算法 1.2.1由DFT到FFT 1.2.2 基2时域抽选算法 …

牛客 | 字符金字塔

请打印输出一个字符金字塔&#xff0c;字符金字塔的特征请参考样例 #include <stdio.h> #include <string.h> using namespace std; int main() {char c;scanf("%c", &c);for (int i 1; i < (c - 64); i)//第一个循环决定了有多少行{//c:67 第三…

linux学习:音视频编程+alsa声音架构

目录 概念 采样 量化 编码 音频文件wav 格式 标准音频接口 ALSA 录制音频 步骤 api 获取pcm设备句柄 设置 PCM 设备参数 代码 播放音频 步骤 代码 概念 信号都是模拟信号&#xff0c;不管是声音还是光线&#xff0c;这些模拟信号需要被 A/D 转换器转换成数字信…

02-Fortran基础--Fortran操作符与控制结构

02-Fortran基础--Fortran操作符与控制结构 0 引言1 操作符1.1 数学运算符1.2 逻辑运算符1.3 关系运算符 2 控制流程2.1 条件结构2.2 循环结构2.3 分支结构 0 引言 运算符和控制流程对编程语言是必须的,Fortran的操作符和控制流程涉及到各种数学运算符、逻辑运算符以及控制结构。…

Backblaze发布2024 Q1硬盘故障质量报告-2

截至2024年第一季度末&#xff0c;我们正在跟踪279,572块正在运行的硬盘。硬盘型号在2024年第一季度末必须拥有500块或更多的硬盘&#xff0c;并在整个使用寿命期间累积超过100,000个硬盘工作日&#xff0c;达到这个条件的所有型号盘的故障率趋势表现如下&#xff1a; 除了三种…

Linux快速安装Nginx和重新添加模块

目录 一、Nginx快速安装1、下载Nginx2、配置Nginx模块 二、Ngnix重新编译和安装模块 一、Nginx快速安装 1、下载Nginx 直接进入Nginx官网下载Linux最新稳定版本&#xff0c;我之前下载的版本是1.23.0。 2、配置Nginx模块 下载完后我把源码压缩文件解压放在/opt/appl/nginx…

无卤素产品是什么?有什么作用?

无卤素产品&#xff0c;即在生产过程中完全不使用卤素元素——氟、氯、溴、碘等——的产品。 卤素元素&#xff0c;虽然在电子设备、材料等领域应用广泛&#xff0c;却也可能潜藏危害。其阻燃剂&#xff0c;一旦在产品生命周期结束后释放&#xff0c;将对土壤和水体造成污染&a…

参数配置不生效导致海思1151芯片TPC功率超大,引起性能恶化。

• 【Wi-Fi领域】【现网案例4】参数配置不生效导致海思1151芯片TPC功率超大&#xff0c;引起性能恶化。 【问题描述】XXX客户反馈OLT-HG8245W5-6T–Wi-Fi–WA8021V5-LAN-PC组网概率出现近距离测速只有20Mbps 【问题单】DTS2022101410914 【问题分析】 在客户反馈此问题后&#…

【MM32F3270 Micropython】pwm输出

文章目录 前言一、PWM脉宽调制技术介绍二、machine.PWM 类2.1 machine.PWM 类的构造对象2.2 PWM 对象初始化2.3 关闭PWM设备2.4 设置pwm的周期2.5 设置占空比 三、pwm示例代码总结 前言 MicroPython是一种精简的Python 3编程语言实现&#xff0c;旨在在微控制器和嵌入式系统上…

基于CLAHE算法的图像增强及评价

摘要&#xff1a; 本研究旨在探讨对比度限制自适应直方图均衡化&#xff08;CLAHE&#xff09;算法在数字图像处理中的应用。CLAHE算法通过在局部区域内进行直方图均衡化&#xff0c;有效地增强了图像的对比度&#xff0c;并在保持图像细节的同时避免了过度增强的问题。本文通过…

C语言判断字符旋转

前言 今天我们使用c语言来写代码来实现字符串选择的判断&#xff0c;我们来看题目 题目描述 写一个函数&#xff0c;判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如&#xff1a;给定s1 AABCD和s2 BCDAA&#xff0c;返回1 给定s1abcd和s2ACBD&#xff0c;返回0. A…

关于获取邮件授权码

以网易邮箱为例: 第一步:登录之后点击设置 第二步:点击POP3/SMTP/IMAP 第三步:开启SMTP服务 开启哪个都可以 第四步: 扫描二维码开启服务 第五步: 使用手机扫面二维码发送短信 第六步: 得到授权码 将授权码写入配置文件

ADS基础教程10-多态性(动态模型选择)

目录 一、多态性定义二、操作步骤&#xff11;.模型建立&#xff12;.模型选择&#xff13;.执行仿真 一、多态性定义 ADS中支持一个Symbol中&#xff0c;可以同时存在多个子图。在仿真时可以动态选择不同的子图继续宁仿真。 二、操作步骤 &#xff11;.模型建立 在上一章A…

路飞吃桃递归问题

在写代码之前&#xff0c;补充两个知识点 1.C语言递归的模版 2.递归是怎么工作的 好!话不多说让我们开始吧&#xff1a; 我们知道路飞吃了n天&#xff0c;每次都是吃一半&#xff0b;1&#xff0c;知道最后一天&#xff0c;只有一个桃子了&#xff0c;所以就可以列出式子&…

抖音小店个人店和个体店有什么不同?区别问题,新手必须了解!

哈喽~我是电商月月 新手开抖音小店入驻时会发现&#xff0c;选择入驻形式时有三个选择&#xff0c;个人店&#xff0c;个体店和企业店 其中&#xff0c;个人店和个体店只差了一个字&#xff0c;但个人店不需要营业执照&#xff0c;是不是入驻时选择个人店会更好一点呢&#x…

『 Linux 』基础IO/文件IO (万字)

文章目录 &#x1f984; 什么是IO&#x1f984; 文件IO(库级别)&#x1f47e; 文件的打开与关闭&#x1f47e; 当前路径&#x1f47e; 文件的读写 &#x1f984; 标准输入输出流&#x1f984; 文件IO(系统级别)&#x1f47e; 文件的打开&#x1f47e; 文件的关闭&#x1f47e; …
最新文章