上课睡觉(合并石子问题)
有 NN 堆石子,每堆的石子数量分别为 a1,a2,…,aN。
你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a=[1,2,3,4,5],合并第2,3 堆石子,则石子堆集合变为 a=[1,5,4,5]。
我们希望通过尽可能少的操作,使得石子堆集合中的每堆石子的数量都相同。
请你输出所需的最少操作次数。
本题一定有解,因为可以将所有石子堆合并为一堆。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 N。
第二行包含 N 个整数a1,a2,…,aN。
输出格式
每组数据输出一行结果。
数据范围
1≤T≤10,
1≤N≤10^5,
0≤ai≤10^6,
∑i=1nai≤10^6,
每个输入所有 N 之和不超过 10^5。
输入样例:
3
6
1 2 3 1 1 1
3
2 2 3
5
0 0 0 0 0
输出样例:
3
2
0
样例解释
第一组数据,只需要用 33 个操作来完成:
1 2 3 1 1 1
-> 3 3 1 1 1
-> 3 3 2 1
-> 3 3 3
第二组数据,只需要用 22 个操作来完成:
2 2 3
-> 2 5
-> 7
第三组数据,我们什么都不需要做。
思路:1e5的约数个数为七百多个,所有石子个数的和,可以分为 i 堆,每堆sum / i个石子,又因为只能合并相邻的石子堆, 所以可以把所有石子分为若干段,每段石子总数为sum/i 。
由于约数个数只有七百多,所以时间复杂度O(N*700)
代码
#include<iostream>using namespace std;const int N = 1e5 + 10;int n;
int a[N];bool check(int cnt)
{for(int i=1,s=0;i<=n;i++){s+=a[i];if(s>cnt) return false;if(s==cnt) s=0;}return true;
}
int main()
{int T;scanf("%d",&T);while(T--){scanf("%d",&n);int sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}for(int i=n;i>=0;i--) {if(sum%i==0 && check(sum/i)){printf("%d\n",n-i);break;}}}return 0;
}
上课睡觉(合并石子问题)相关推荐
- 【Acwing寒假2023每日一题】4366. 上课睡觉 - 枚举
4366. 上课睡觉 - AcWing题库 思路: 我们可以从大到小枚举最后分成的堆数 最后分成的堆数越多 操作数越小 sum可以整除堆数 且 sum能被均分成cnt个/堆 如何判断sum能不能被均分 ...
- 学生上课睡觉班主任怎么处理_学生上课睡觉,老师的管与不管,不是你看到的那么简单...
学生上课睡觉的原因,可以分为正常的和不正常的. 正常的,一种是在天气热的时候,人容易犯困,学生会有上课睡觉的:另一种是因为学习熬夜,导致的白天没精神而上课的时候控制不住自己睡觉. 不正常的,一种是熬夜 ...
- 蒟蒻吃药计划-治疗系列 #round 2 合并石子+乘积最大
1.合并石子 <信息学奥赛一本通>第五版 P371 第三节 T1 我就直接开始讲吧: Warning:这个题目和 合并果子 不一样!不一样!不一样!不一样!不一样!不一样!不一样!不一样! ...
- 带套属于安全行为吗_教师不管学生上课睡觉的行为,属于不负责任吗?建议收藏!...
这是当老师的失职 组织教学是课堂重中之重,课堂上看到学生睡觉,不管不问,听之任之,这是当老师的失职,失德行为,是误人子弟之举!一个学生睡觉你不管不问,接下来就有几个甚至更多,教学质量如何谈起?上课有学 ...
- 合并石子 四边形不等式优化
题目描述 有一排石子,共n 堆.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分. ...
- 蓝桥杯-合并石子(java)
算法提高 合并石子 时间限制:2.0s 内存限制:256.0MB问题描述在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求 ...
- 学生上课睡觉班主任怎么处理_班主任案例:学生上课睡觉应对策略
班主任案例:学生上课睡觉应对策略 我正在讲台上津津有味地分析着<苏州园林>那刻意追求自然情趣的美妙,忽然发现最后一排的一个同学趴在了桌子上,我虽然嘴上没有停止讲解,但内心对这个现象早就懊恼 ...
- 合并石子 区间dp水题
合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N- ...
- 学生上课睡觉班主任怎么处理_学生上课睡觉鼾声如雷,老师要拍照发家长群吗?一线教师为你分析...
原本的差生,经过时代的变迁,完成了多次"华丽转身":先是转变为"学困生",后来演变为"潜能生",估计现在那些教育专家还在酝酿别的名称.不过& ...
最新文章
- WIN7 常见问题及解决方法
- Java实现简单的队和栈
- struts工作流程
- Android之webView入门
- java mongodb 增删改查_java操作mongodb:基本的增删改查
- Core Location :⽤用于地理定位
- 用VC写Assembly代码(6)--附录3[X86指令使用详解]
- Ubuntu禁用网卡步骤(重启依然生效)
- html5 app 原理,html5打包成app应用的原理是什么?
- c语言输出字母随机数,你好,怎样用c语言输出一个1到100的随机数
- 游戏内存读取工具_不因内存弃旧爱,东芝Canvio Gaming移动硬盘评测
- SQLsever --数据库置疑
- 人工智能-马尔可夫模型
- 电脑总是意外从睡眠状态唤醒,可以找出原因然后解决
- 全网最全开源数据集 | 资源
- 跟风“涨价”,品牌老化,为何“0糖”的奥利奥不被消费者买账?
- C# wherewhereif
- PJzhang:百度网盘是如何泄露公司机密的?
- Codeforces Round #376 (Div. 2) D. 80-th Level Archeology —— 差分法 + 线段扫描法
- 在Java中12个常见的语法糖!