1. 程式人生 > >逆向思維題

逆向思維題

牛客網是IT求職神器,提供海量C++、JAVA、前端等職業筆試題庫,線上進行百度阿里騰訊網易等網際網路名企筆試面試模擬考試練習,和牛人一起討論經典試題,全面提升你的程式設計。作為acmer的小A,牛客網是他首選的題庫。
小A是一箇中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每一個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成一個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n-1個元素加1,但是小A並不能很好的算出最優的解決方案,如果你能幫他解決這個問題,小A就能送你一個氣球

輸入描述:

第一行一個整數T(T<=100),表示組數

對於每組資料有一個n,表示序列的長度(0< n <100000)

下面一行有n個數,表示每個序列的值(0<ai<1000)

輸出描述:

輸出兩個數
第一個數表示最小的操作步數
第二個數經過若干步以後的陣列元素是什麼
思路:n
#include <cstdio>
#include <cmath>
const int N = 1e5 + 10;
const int Inf = 0x3f3f3f3f;
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || '9' < ch)
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while ('0' <= ch && ch <= '9')
    {
        x = x * 10 + ch - 48;
        ch = getchar();
    }
    return x * f;
}
 
int n, a[N];
void solve()
{
    int n = read(), min = Inf;
    for (int i = 1; i <= n; ++i)
        a[i] = read();
    for (int i = 1; i <= n; ++i)
        min = a[i] < min ? a[i] : min;
    long long s = 0;
    for (int i = 1; i <= n; ++i)
        s += a[i] - min;
    printf("%lld %lld\n", s, min + s);
}
int main()
{
    for (int T = read(); T; T--)
        solve();
    return 0;
}

-1個數+1等價於1個數-1所以只要將每個數減到和最小的數相同就可以(和最小值差值的和就是進行的運算元),最後正著推回去,因為最小值沒有減過,所以最小值每一步都在加1,所以最後最小值加上運算元就是最終的數字。