测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }
上一题 下一题