J-強迫症的序列 第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽
阿新 • • 發佈:2018-11-11
題目連結:https://www.nowcoder.com/acm/contest/90/J
題目描述
牛客網是IT求職神器,提供海量C++、JAVA、前端等職業筆試題庫,線上進行百度阿里騰訊網易等網際網路名企筆試面試模擬考試練習,和牛人一起討論經典試題,全面提升你的程式設計。作為acmer的小A,牛客網是他首選的題庫。
小A是一箇中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每一個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成一個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n-1個元素加1,但是小A並不能很好的算出最優的解決方案,如果你能幫他解決這個問題,小A就能送你一個氣球
輸入描述:
第一行一個整數T(T<=100),表示組數
對於每組資料有一個n,表示序列的長度(0 < n < 100000)
下面一行有n個數,表示每個序列的值(0 < ai < 1000)
輸出描述:
輸出兩個數
第一個數表示最小的操作步數
第二個數經過若干步以後的陣列元素是什麼
示例1
輸入
1
3
1 2 3
輸出
3 4
Description:
給出一個數組,每一次可以選擇 n-1 個數將它們全部加一,使得最後所有數都相等所需要的最少步數
Solution:
將 n-1 個數全部加1,其實就相當於將所有數都加1,然後再將其中一個數減去1。
那麼問題就轉化為了每次選一個數將其減一,求達到目的的最小運算元。
那麼也就是各個數與最小值之差的和。
Code:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define _rush() int T; cin >> T; for(int Case = 1; Case <= T; Case++)
#define rush() int T; scanf("%d", &T); for(int Case = 1; Case <= T; Case++)
#define mst(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int INF = 0x3f3f3f3f;
const double eps = 1e-9;
const int Mod = 1e9 + 7;
const int MaxN = 1e5 + 5;
int a[MaxN];
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--) {
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
int ans = 0;
for(int i = 1; i <= n; i++) ans += a[i] - a[1];
cout << ans << " " << a[1] + ans << endl;
}
return 0;
}