逆向思維題
阿新 • • 發佈:2019-01-02
牛客網是IT求職神器,提供海量C++、JAVA、前端等職業筆試題庫,線上進行百度阿里騰訊網易等網際網路名企筆試面試模擬考試練習,和牛人一起討論經典試題,全面提升你的程式設計。作為acmer的小A,牛客網是他首選的題庫。
小A是一箇中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每一個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成一個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n-1個元素加1,但是小A並不能很好的算出最優的解決方案,如果你能幫他解決這個問題,小A就能送你一個氣球
-1個數+1等價於1個數-1所以只要將每個數減到和最小的數相同就可以(和最小值差值的和就是進行的運算元),最後正著推回去,因為最小值沒有減過,所以最小值每一步都在加1,所以最後最小值加上運算元就是最終的數字。
小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,所以最後最小值加上運算元就是最終的數字。