✏️ 纠错
第 144 题 / 共 155 题
题目描述
小 A 有一个由 n 个非负整数构成的数组 a=[a1,a2,…,an]。他会对阵组 a 重复进行以下操作,直到数组 a 只包含 0。在一次操作中,小 A 会依次完成以下三个步骤:
- 在数组 a 中找到最大的整数,记其下标为 k。如果有多个最大值,那么选择其中下标最大的。
- 从数组 a 所有不为零的整数中找到最小的整数 aj。
- 将第一步找出的 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;
}
#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;
}