【題目描述】
小 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 所需要的操作次數。
【輸入樣例一】
3
2 3 4
【輸出樣例一】
7
【輸入樣例二】
5
1 3 2 2 5
【輸出樣例二】
13
【數據範圍】
對於所有測試點,保證 1≤n≤100,0≤ai≤100。
【算法分析】
終止條件:當數組中的最大值變為 0 時,説明所有元素都已為 0。
【算法代碼】
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
int a[maxn];
int cnt;
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
while(1) {
int p=n; //max-value's position
for(int i=1; i<=n; i++) {
if(a[i]>=a[p]) p=i;
}
if(a[p]==0) break;
int t=a[p]; //min-value
for(int i=1; i<=n; i++) {
if(a[i]!=0) t=min(t,a[i]);
}
a[p]-=t;
cnt++;
}
cout<<cnt<<endl;
return 0;
}
/*
in:
5
1 3 2 2 5
out:
13
*/