题目链接

大意

有\(N\)种颜色的球,第\(i\)种球有\(Ai\)个,要求把球分成几个集合,使得:

  1. 一个集合里的球只能有一种颜色。
  2. 任意两个集合的球的数量相差不能超过1。

求这些球至少需要分几个集合。

思路

我们设这些集合的大小为\(Ans\)与\(Ans+1\),考虑如何判断一个\(Ans\)是否可行。

由于一个集合里只能有一种颜色,所以我们可以对于每一种颜色都单独考虑。

设当前颜色为\(i\),我们设 \(Ai=X\cdot Ans+ Y\),其中\(Ans,Y\)满足\(Ans>Y\)。

那么易发现,若\(Y>X\),则剩下的\(Y\)个数就算平均分到\(X\)个集合里,也会剩下\((Y-X)\)个数,那么我们的\(Ans\)就不符合条件了。

又由于在\(Ai=X\cdot Ans+ Y\)式子中的\(X=\left \lfloor Ai/Ans \right \rfloor,Y=Ai\%Ans\)

化简一下,一个\(Ans\)可行的条件为:对于任意\(i\),都满足\(\left \lfloor Ai/Ans \right \rfloor\ge Ai\%Ans\)


尽管已经知道了如何判断一个\(Ans\)是否可行,但如果我们暴力去枚举\(Ans\),复杂度也是\(O(N\times A)\),考虑优化。

首先有一个很明显的性质就是\(Ans\le Min(Ai)\),即\(Ans\)至多是\(A\)中的最小值。

对于\(Ans\)的判断式:\(\left \lfloor Ai/Ans \right \rfloor\ge Ai\%Ans\)。

发现在\(Ans\le\sqrt{Ai}\)时,肯定是恒满足的,因为

\(\left \lfloor Ai/Ans \right \rfloor\ge \sqrt{Ai}\ge Ans\ge Ai\%Ans\)

所以所有满足\(Ans\le\sqrt{Ai}\)的\(Ans\)肯定都是可行的\(Ans\)。

考虑\(Ans>\sqrt{Ai}\)的情况:

在这种情况下,我们的判断式就会满足\(\left \lfloor Ai/Ans \right \rfloor<\sqrt{Ai}<Ans\),

所以我们不妨枚举\(\left \lfloor Ai/Ans \right \rfloor\)即\(X\)的取值,这样的复杂度是\(O(N\cdot\sqrt{A})\),可以接受。

然后又由于要让\(Ans\)可行,所以我们要让\(\left \lfloor Ai/Ans \right \rfloor\ge Ai\%Ans\),即\(Ans>X\ge Y\).

考虑满足上述条件下的\(Ans\)的取值为多少:

  • 由于\(Ai=X\cdot Ans+ Y\),\(Ans=\left \lfloor \frac{Ai-Y}{X} \right\rfloor\),在这种情况下,我们只知道\(X\)和\(Ai\),所以考虑\(Y\)的取值情况。

    由于\(0\le Y\le X\),则有\(\frac{Ai-X}{X}\le \frac{Ai-Y}{X}\le \frac{Ai}{X}\),\(\left \lfloor \frac{Ai-X}{X}\right \rfloor\le \left \lfloor \frac{Ai-Y}{X}\right \rfloor\le \left \lfloor \frac{Ai}{X}\right \rfloor\),

    即\(\left \lfloor \frac{Ai}{X}-1\right \rfloor\le Ans\le \left \lfloor \frac{Ai}{X}\right\rfloor\),\(\left \lfloor \frac{Ai}{X}\right \rfloor-1\le Ans\le \left \lfloor \frac{Ai}{X}\right\rfloor\)

    故\(Ans=\left \lfloor \frac{Ai}{X}\right \rfloor-1\)或\(\left \lfloor \frac{Ai}{X}\right\rfloor\),
  • 另:当\(Ans=\left \lfloor \frac{Ai}{X}\right \rfloor-1\)时,\(Ai=X\cdot Ans+Y=X\cdot\left \lfloor \frac{Ai}{X}\right\rfloor+Y-X\),

    又由于\(Y-X\le 0,X\cdot\left \lfloor \frac{Ai}{X}\right\rfloor\le Ai\),所以\(Ans=\left \lfloor \frac{Ai}{X}\right \rfloor-1\)时,只在\(Ai\%X=0\)时成立。

    (注:也可以这样理解:\(Ai=X\cdot Ans=X\cdot(Ans-1)+X\))

综上,\(Ans=\left \lfloor \frac{Ai}{X} \right \rfloor\),特殊的,当\(Ai\%X=0\)时,\(Ans\)还有可能为\((\left \lfloor \frac{Ai}{X}\right\rfloor-1)\)。


在求出\(Ans\)(集合大小中较小值)后,统计答案时就优先放\(Ans+1\),再放\(Ans\)这样的考虑就行了。

代码

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const int MAXN=505;
int N,A[MAXN];
int St,Mi=1e9,Ans;
int Check(int ans){
for(int i=1;i<=N;i++)
if(A[i]/ans<A[i]%ans)
return 0;
return 1;
}
long long Get(){
long long ans=0;
for(int i=1;i<=N;i++){
int m=(Ans+1-A[i]%(Ans+1))%(Ans+1);//还剩m个空位需要Ans来补.
ans+=m+(A[i]-m*Ans)/(Ans+1);
}
return ans;
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&A[i]),Mi=min(Mi,A[i]);
St=sqrt(Mi)+1;Ans=St-1;
for(int i=1;i<=St;i++){
if(Check(Mi/i)){
Ans=max(Ans,Mi/i);
break;
}
if(Mi%i==0)
if(Check(Mi/i-1)){
Ans=max(Ans,Mi/i-1);
break;
}
}
printf("%lld\n",Get());
}
/*
A<=(A/K)*(K+1)
ceil(A/val)-1<=K
*/

【CF792E】Colored Balls(数论分块)的更多相关文章

  1. CF792E Colored Balls

    题目大意:将n个数分解成若干组,如4 = 2+2, 7 = 2+2+3,保证所有组中数字之差<=1. 首先我们能想到找一个最小值x,然后从x+1到1枚举并check,找到了就输出.这是40分做法 ...

  2. CF792E Colored Balls【思维】

    题目传送门 考试的时候又想到了小凯的疑惑,真是中毒不浅... 设每一个数都可以被分成若干个$k$和$k+1$的和.数$x$能够被分成若干个$k$和$k+1$的和的充要条件是:$x%k<=floo ...

  3. Codeforces554 C Kyoya and Colored Balls

    C. Kyoya and Colored Balls Time Limit: 2000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...

  4. codeforces 553A . Kyoya and Colored Balls 组合数学

    Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...

  5. Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls 排列组合

    C. Kyoya and Colored Balls Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  6. Kyoya and Colored Balls(组合数)

    Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. C. Kyoya and Colored Balls(Codeforces Round #309 (Div. 2))

    C. Kyoya and Colored Balls Kyoya Ootori has a bag with n colored balls that are colored with k diffe ...

  8. 【BZOJ1257】余数之和(数论分块,暴力)

    [BZOJ1257]余数之和(数论分块,暴力) 题解 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的 ...

  9. 51nod“省选”模测第二场 B 异或约数和(数论分块)

    题意 题目链接 Sol 这题是来搞笑的吧.. 考虑一个数的贡献是\(O(\frac{N}{i})\) 直接数论分块. #include<bits/stdc++.h> #define Pai ...

随机推荐

  1. ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列

    接上一篇:ActiveMQ基础教程(二):安装与配置(单机与集群) 安装部署好集群环境:192.168.209.133:61616,192.168.209.134:61616,192.168.209. ...

  2. 初识python: 文件下载进度

    (后续待更新...) 使用 request 的 urlretrieve 方法创建"回调函数": 下载进度 详细代码如下: #!/user/bin env python # auth ...

  3. Linux下校验SHA1和MD5的方法

    当我们从互联网下载东西或者从U盘拷贝东西的时候,通常是不会和源文件有什么区别的,但是在偶然的情况下会出现下载或者拷贝出错的情况, 尤其是在下载大文件的时候,比如系统光盘......当你装机到一半才发现 ...

  4. NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】

    1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...

  5. Elasticsearch安装与配置

    一.下载(华为云) https://mirrors.huaweicloud.com/elasticsearch/https://mirrors.huaweicloud.com/kibana/7.6.2 ...

  6. RocketMQ架构原理解析(一):整体架构

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  7. 面试官: Flink双流JOIN了解吗? 简单说说其实现原理

    摘要:今天和大家聊聊Flink双流Join问题.这是一个高频面试点,也是工作中常遇到的一种真实场景. 本文分享自华为云社区<万字直通面试:Flink双流JOIN>,作者:大数据兵工厂 . ...

  8. Java对象内存模型

    2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...

  9. RHCSA 第三天

    1.将echo "This is my first time to use pipe"内容输出到屏幕上,且保存到pipe_data.txt中 2. 重定向: a.新建一个文件red ...

  10. 内核内存分配器SLAB和SLUB

    内核分配器的功能 在操作系统管理的虚拟内存中,用于内存管理的最小单位是页,大多数传统的架构是4KB.由于进程每次申请分配4KB是不现实的,比如分配几个字节或几十个字节,这时需要中间机制来管理页面的微型 ...