✏️ 纠错
第 144 题 / 共 155 题

题目描述

小 A 有一个由 n 个非负整数构成的数组 a=[a1​,a2​,…,an​]。他会对阵组 a 重复进行以下操作,直到数组 a 只包含 0。在一次操作中,小 A 会依次完成以下三个步骤:

  1. 在数组 a 中找到最大的整数,记其下标为 k。如果有多个最大值,那么选择其中下标最大的。
  2. 从数组 a 所有不为零的整数中找到最小的整数 aj​。
  3. 将第一步找出的 ak​ 减去 aj​。

例如,数组 a=[2,3,4] 需要 7 次操作变成 [0,0,0]:

[2,3,4]→[2,3,2]→[2,1,2]→[2,1,1]→[1,1,1]→[1,1,0]→[1,0,0]→[0,0,0]

小 A 想知道,对于给定的数组 a,需要多少次操作才能使得 a 中的整数全部变成 0。可以证明,a 中整数必然可以在有限次操作后全部变成 0。你能帮他计算出答案吗?

输入格式

第一行,一个正整数 n,表示数组 a 的长度。

第二行,n 个非负整数 a1​,a2​,…,an​,表示数组 a 中的整数。

输出格式

一行,一个正整数,表示 a 中整数全部变成 0 所需要的操作次数。

输入输出样例

输入 #1

3
2 3 4

输出 #1

7

输入 #2

5
1 3 2 2 5

输出 #2

13

说明/提示

对于所有测试点,保证 1≤n≤100,0≤ai​≤100。

📝 题目解析
【解析】首先读取数组大小n和数组元素a[1..n],进入无限循环,直到找到的最大值为0被break打断。首先找到数组中值最大的元素位置mx(如果有多个最大值,取最后一个,所以if内设置为>=)如果最大值已经是0,退出循环,若不被打断则找到数组中所有正数的最小值mn,将最大值位置的元素减去这个最小值mn,操作次数cnt加1,最后输出操作总次数cnt

#include <algorithm>
#include <cstdio>

using namespace std;

const int N = 105;
int n;
int a[N];
int cnt;

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    while (1) {
        int mx = 1;
        for (int i = 1; i <= n; i++) {
            if (a[i] > a[mx]) mx = i;
        }
        if (a[mx] == 0) break;
        int mn = a[mx];
        for (int i = 1; i <= n; i++) {
            if (a[i] > 0) mn = min(mn, a[i]);
        }
        a[mx] -= mn;
        cnt++;
    }
    printf("%d\n", cnt);
    return 0;
}