A23698. 数组清零
填空题
中等
知识点
题目描述
数组清零
题目描述
小 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 。
参考答案
#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 = n;
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;
}
上一题
下一题