強迫症的序列 (第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


說實話,這道題我當時是沒有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]);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章