题解: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.mzph.cn/diannao/7747.shtml

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

相关文章

栈的磁盘优化:降低存取成本的算法与实现

栈的磁盘优化&#xff1a;降低存取成本的算法与实现 问题背景简单实现方法的分析实现方法PUSH操作POP操作成本分析渐近分析 优化实现方法实现方法成本分析渐近分析 进一步优化&#xff1a;双页管理策略实现方法管理策略成本分析 伪代码示例C代码示例结论 问题背景 在具有有限快…

【vulhub靶场】Tomcat中间件漏洞复现

【vulhub靶场】Tomcat中间件漏洞复现 一、Tomcat AJP 任意文件读取/包含漏洞 &#xff08;CVE-2020-1938&#xff09;1. 漏洞描述2. 影响版本3. 漏洞原理4. 漏洞复现 二、任意文件写入漏洞 &#xff08;CVE-2017-12615&#xff09;1. 漏洞原理2. 影响版本3. 漏洞复现 三、Tomca…

Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用

在并发编程中&#xff0c;CountDownLatch、CyclicBarrier 和 Semaphore 是 Java 提供的同步辅助类&#xff0c;它们用于控制线程之间的协调。以下是每个类的基本用法和特点&#xff1a; CountDownLatch&#xff08;倒计时门闩&#xff09;&#xff1a; CountDownLatch 是一个同…

C语言程序的编译与链接过程

在编写C语言程序时&#xff0c;我们通常只是编写源代码&#xff08;.c文件&#xff09;&#xff0c;但要让计算机真正执行这些代码&#xff0c;还需要经过编译和链接两个主要步骤。下面&#xff0c;我们将详细解析这两个过程。 一、编译过程 编译是将源代码&#xff08;.c文件…

unity华为sdk接入指路指南

目前比较靠谱的几个方案&#xff1a;试过几个仅供参考 温馨提示&#xff1a;最高目前可支持方案到unity2021版本以下&#xff0c;以上请联系华为官方寻求技术支持 Unity集成华为游戏服务SDK方式&#xff08;一&#xff09;&#xff1a;集成Unity官方游戏SDK&#xff1a; 华为…

数据倾斜常见的解决办法

造成数据倾斜的原因主要有2种&#xff1a;在map端读取不可分割的大文件、处理大量相同的key 解决办法一般有以下几种&#xff1a; 1、对于空值引发的数据倾斜 &#xff08;1&#xff09;在sql语句中单独处理空值的数据&#xff0c;最后union all &#xff08;2&#xff09;…

关于多态~

多态的基本概念 多态是c面向对象的三大特性之一 多态分为两类&#xff1a;静态多态和动态多态 静态多态&#xff1a;函数重载&#xff0c;运算符重载&#xff0c;复用函数名 动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态和动态多态的区别&#xff1a; 静态…

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

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

Eclipse 开创性地集成 Neon Stack,将 EVM 兼容性带到 SVM 网络

2024年5月2日&#xff0c;全球——在塑造区块链网络的战略联盟的过程中&#xff0c;Eclipse 通过集成 Neon EVM 核心团队开发的技术堆栈 Neon Stack&#xff0c;成为首个打破 EVM-SVM 兼容性障碍的生态。 Eclipse 旨在通过结合以太坊和 Solana 的最佳特性&#xff0c;来重构区…

mksh静态编译

代码来源&#xff1a;https://github.com/MirBSD/mksh.git 需求&#xff0c;基于musl库编译一个静态可执行文件&#xff0c;验证 musl库是否正常 根据 Build.sh文件定义&#xff0c;可以设置 LDFLAGS, CFLAGS,LIBS等参数 1. 首先编译musl ./configure --enable-debugyes --…

java 继承和静态属性或方法

目录 继承 静态属性和方法 继承与静态属性或方法的关系&#xff1a; 示例&#xff1a; 注意&#xff1a; PS&#xff1a;如有错漏之处&#xff0c;敬请指正 在Java中&#xff0c;继承和静态属性或方法是面向对象编程中的两个重要概念。它们在类设计和使用中扮演着不同的角…

数据结构(c):队列

目录 &#x1f37a;0.前言 1.什么是队列 2. 队列的实现 2.1定义队列节点 2.2定义队列 2.3队尾入队列 2.4判断队列是否为空 2.5队头出队列 2.6 队列首元素 2.7队尾元素 2.8队列内的元素个数 2.9销毁队列 3.试运行 &#x1f48e;4.结束语 &#x1f37a;0.前言 言C之…

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

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

【SSM进阶学习系列丨分页篇】PageHelper 分页插件集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页&#xff0c;使用的是PageHelper分页插件&#xff0c;版本使用的是5.1.8 。 ​ 参考文档…

Linux命名管道的创建及应用

目录 一、命名管道的定义即功能 1.1创建命名管道 1.2匿名管道和命名管道的区别 1.3命名管道的打开规则 1.4系统调用unlink 二、进程间命名管道的创建及使用 2.1Comm.hhp 2.2PipeServer.cc 2.3PipeClient.cc 一、命名管道的定义即功能 管道应用的一个限制就是只能在具有…

[报错解决]SpringBoot子项目打jar包启动报 XXX--1.0-SNAPSHOT.jar中没有主清单属性

目录 报错信息解决原因原因分析解决方案 报错信息 解决 原因 在使用SpringBoot架构搭建父子工程时&#xff0c;使用IDEA可以正常启动&#xff0c;对子项目打成jar包后使用jar方式启动时&#xff0c;会报错xx.jar中没有主清单属性。 原因分析 原因主要是在使用jar方式启动时…

鸿蒙OpenHarmony南向:【Hi3516标准系统入门(命令行方式)】

Hi3516标准系统入门&#xff08;命令行方式&#xff09; 注意&#xff1a; 从3.2版本起&#xff0c;标准系统不再针对Hi3516DV300进行适配验证&#xff0c;建议您使用RK3568进行标准系统的设备开发。 如您仍然需要使用Hi3516DV300进行标准系统相关开发操作&#xff0c;则可能会…

javaweb学习笔记1

1、基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com 静态web html,css 提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站&#xff1b; 提供给所有人看的数据始终会发生变化&…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术

采用全流程模式将地下水数值模拟软件GMS的操作进行详细剖析和案例联系。不仅使学员掌握地下水数值模拟软件GMS的全过程实际操作技术的基本技能&#xff0c;而且可以深刻理解模拟过程中的关键环节&#xff0c;以解决实际问题能力。同时为满足环评从业人员进一步加强地下水数值模…

typescript 中的泛型

泛型&#xff1a;解决 类、接口、方法的复用性、以及对不特定数据类型的支持 传入的参数与返回参数类型一致 泛型函数 // T表示泛型&#xff0c;具体什么类型是调用这个方法的时候决定的 function getData<T>(value: T): T {return value } getData<number>(123) …