1. 程式人生 > >J-強迫症的序列 第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽

J-強迫症的序列 第13屆景馳-埃森哲杯廣東工業大學ACM程式設計大賽

題目連結: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; }