学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++周赛 | 汇总-CSDN博客
【题目描述】
众所周知,猫的故乡是遥远的星球“喵星”,他们来到地球是为了奴役无知的人类。成功征服地球后,喵始皇有了征服世界的打算,他深知打铁还得自身硬,决定为了“喵星”新一代的喵星人开设一所大学——“喵星学院”,用于传授生存和战斗技巧。
教官注意到在讲授理论的课堂上,总是有一只喵星人 Tom 打瞌睡。教官让班上的另一只喵星人 Jerry 记录 Tom 在一节课中睡着的次数。一共有 n 节理论课,Jerry 记录下 Tom 在第 i 节课上睡着了 ai 次。
Jerry 想要修改一下自己的记录,从而使得 Tom 在每节课上睡着的次数都是相同的,这样教官就会认为是 Tom 故意的,那么 Tom 就会更惨了。
Jerry 可以修改记录的唯一方式是合并两个相邻的课堂的睡觉次数,例如 a=[1,2,3,4,5],如果 Jerry 合并第 2 讲和第 3 讲的睡觉次数,则记录将变为 [1,5,4,5]。
Jerry 想要知道他最少需要对记录修改多少次,可以使得记录中所有数相同。
【输入】
第一行包含整数 T,表示共有 T 组测试数据。
每组测试数据有两行:
第一行,包含一个整数 n;
第二行,包含 n 个整数 a1,a2,…,an。
保证 Tom 在所有讲次的课堂上睡着的总次数不超过 10^6。
【输出】
输出 T 行,对每组测试数据输出 Jerry 可以令记录中的所有数相等所需进行的最小修改次数。
【输入样例】
3
6
1 2 3 1 1 1
3
2 2 3
5
0 0 0 0 0
【输出样例】
3
2
0
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int T, n, a[100005];
int main()
{
cin >> T; // 输入T
while (T--) { // 遍历T次询问
cin >> n; // 输入n
int sum = 0; // 定义统计和,计算所有a[i]之和
memset(a, 0, sizeof(a)); // 每次都需重新初始化a数组
for (int i=1; i<=n; i++) { // 输入n个数
cin >> a[i];
sum += a[i]; // 并统计数字总和
}
for (int i=0; i<=n-1; i++) { // 从n次修改遍历至1次修改
if (sum%(n-i)==0) { // 如果总和对修改次数取余为整数
int s = 0; // 定义调整后之和
int avg = sum / (n-i); // 计算平均值
int flag = 0; // 定义标记位
for (int j=1; j<=n; j++) { // 遍历n个数
s += a[j]; // 依次两两合并统计
if (s==avg) s = 0; // 如果可以等于avg,s重新归零再进行新的一轮统计
if (s>avg) { // 如果s大于avg,说明这个调整是不可能达到目标的
flag = 1; // 修改flag
break; // 退出循环
}
}
if (flag==0) { // 如果循环完,flag仍为0,说明可以达到目标的
cout << i << endl; // 输出i
break; // 因为i从小到大递增,所以此时就是最小调整次数,退出循环
}
}
}
}
return 0;
}
【运行结果】
3
6
1 2 3 1 1 1
3
3
2 2 3
2
5
0 0 0 0 0
0