题目链接

大意

有\(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. Spring @Valid 和 @Validated 的区别和使用

    两者区别 @Valid @Validated 标准 标准JSR-303规范 增强JSR-303规范 包 javax.validation org.springframework.validation ...

  2. css 基础 rgba表示法

    color:rgba(); //r表示red 红色 //g表示green 绿色 //b表示blue 蓝色 //a 表示透明度 color:rgb(0,0,0,0) //黑色 color:rgb(255 ...

  3. pytest执行用例:明明只写了5个测试用例, 怎么收集到33个!?

    pytest收集测试用例的顺序: 同一个项目中搜索所有以test_开头的测试文件.test_开头的测试类.test_开头的测试函数 执行测试用例的顺序: 是按照先数据(0~9)>再字母(a~z) ...

  4. Pytest_allure报告(11)

    一.allure工具环境配置 windows安装allure 1.下载allure工具包 进入工具包官网:https://github.com/allure-framework/allure2/rel ...

  5. [Win32] UAC用户账户控制 (提权)

    最近写程序时遇到一个问题,就是当一个程序需要管理员权限才能正常运行该怎么办? 通过查阅多方资料,我总结出来几个比较实用的办法(每种办法实现方法不同,同时功能上也有一些小小的差异) 方法一(批处理脚本) ...

  6. Go语言系列之日志库zap

    在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例 ...

  7. Java 简单操作hdfs API

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6632047118376780295/ 启动Hadoop出现问题:datanode的clusterID 和 name ...

  8. Android Sensor.TYPE_STEP_COUNTER 计步器传感器 步数统计

    注意:使用 计步器传感器 Sensor.TYPE_STEP_COUNTER 获取步数前需要手机支持该传感器 1.学习资料 1.1 SENSOR.TYPE_STEP_COUNTER 地址:开发者文档 翻 ...

  9. CSS基本语法(二)

    目录 CSS基本语法(二) 八.CSS复合选择器 1.后代选择器** 2.子选择器 3.并集选择器** 4.伪类选择器 链接伪类选择器 :focus伪类选择器 总结 九.CSS的元素显示样式 1.概念 ...

  10. cp 不提示按y

    yes|cp index.html.j2   yml -rf \cp index.html.j2   yml/ 两个效果是一样的