來源:牛客網
輸入描述:
第一行一個整數T(T<=100),表示組數
對於每組數據有一個n,表示序列的長度(0< n <100000)
下面一行有n個數,表示每個序列的值(0<ai<1000)
輸出描述:
輸出兩個數 第一個數表示最小的操作步數 第二個數經過若干步以後的數組元素是什麼
輸入
1 3 1 2 3
輸出
3 4
說實話,這道題我當時是沒有A出來的,不過在後來觀摩了許多大佬的代碼後才發現,這道題確實很簡單,不過在理解別人的代碼的同時,我也有了自己的看法,按照題意,每次有n-1個數加一,一直到每個元素相同,這裏我們知道,每次肯定是除了最大值在進行數值變化,那麼我們在一次次接近不同最大值的時候答案就接近了,當然了,直接暴力肯定會超時,我在這裏說的是,我們每一次進行數值變化,都有可能會出現新的最大值,所以我們每次有要調整最大值目標,但是呢,你會發現,除了最大值,每一個數字與最小值的差都是不變的,比如(1,3,5),我們需要的差值有兩個(2,4),當最小值加到原先最大值的時候所有的值會變成(5,7,5),這個時候(5,7)的差還是2,所以,我們只要把所有的數字與最小值的差值加起來,就是操作的總數,而最後的答案,當然就是操作數加上最小值啦。
代碼如下:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int N=1e5+10;
int s[N];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(s,0,sizeof(s));
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&s[i]);
sort(s,s+n);
int sum=0;
for(int i=1; i<n; i++)
sum+=s[i]-s[0];
printf("%d %d\n",sum,sum+s[0]);
}
}