B4413 [GESP202509 三级] 数组清零

题目描述

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

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

例如,数组 a=[2,3,4]a = [2, 3, 4]a=[2,3,4] 需要 7 次操作变成 [0,0,0][0, 0, 0][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] [2, 3, 4] \rightarrow [2, 3, 2] \rightarrow [2, 1, 2] \rightarrow [2, 1, 1] \rightarrow [1, 1, 1] \rightarrow [1, 1, 0] \rightarrow [1, 0, 0] \rightarrow [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 想知道,对于给定的数组 aaa,需要多少次操作才能使得 aaa 中的整数全部变成 0。可以证明,aaa 中整数必然可以在有限次操作后全部变成 0。你能帮他计算出答案吗?

输入格式

第一行,一个正整数 nnn,表示数组 aaa 的长度。

第二行,nnn 个非负整数 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,,an,表示数组 aaa 中的整数。

输出格式

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

输入输出样例 #1

输入 #1

3
2 3 4

输出 #1

7

输入输出样例 #2

输入 #2

5
1 3 2 2 5

输出 #2

13

说明/提示

对于所有测试点,保证 1≤n≤1001 \leq n \leq 1001n1000≤ai≤1000 \leq a_i \leq 1000ai100

解析

模拟,详见代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[1005];
int ans=0;
int main (){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(1){
        int mx=1;//第几个数最大,默认值为第一个
        for(int i=1;i<=n;i++){//循环找到最大值的位置
            if (a[i]>a[mx]){
                mx=i;
            }
        }
        int mn=mx;//第几个数最小,默认值为最大那个
        for(int i=1;i<=n;i++){//循环找到最小值的位置
            if (a[i]>0&&a[i]<a[mn]){
                mn=i;
            }
        }
        //如果最大值为0,则操作结束
        if (a[mx]==0) break;
        a[mx]-=a[mn];//模拟最大值减去最小值
        ans++;//增加操作次数
    }
    cout<<ans;
    return 0;
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐