小猴编程周赛C++ | 2023年秋第6周T2在课堂上睡觉

学习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
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值