思維題 牛客網 強迫症的序列

2021-09-29 03:54:19 字數 987 閱讀 8653

小a是乙個中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每乙個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成乙個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n-1個元素加1,但是小a並不能很好的算出最優的解決方案,如果你能幫他解決這個問題,小a就能送你乙個氣球

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

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

下面一行有n個數,表示每個序列的值(0示例1

複製

1

31 2 3

複製

3 4
一開始對於 1 2 3 4這個樣例就不知道如何變成相同的,因為是n-1個元素都加1,很多不應該增大的也變大了,很難操控,想想最接近答案的是什麼:三個相同的,乙個不同的(對於1 2 3 4這個樣例來說的),並且很重要的一點是三個相同的要比不相同的小,下一步就是給三個相同的不停的加一加一,直到都相同。

後來找到了規律,看看1 2 3 4怎麼找

1 2 3 4

2 3 3 5

3 4 3 6==3 3 4 6

4 4 4 7//我們找的就是這個

5 5 5 7

6 6 6 7

7 7 7 7//成功

也就是說,倒數第二個不加一,然後·一直保持序列有序,共進行了六次,為什麼要這樣加呢?最後乙個一直增大我們不怕,我們主要想要前n-1個元素相等,所以前面值小的元素要多加幾次1,相對來說大的就最好少加幾次,前n-1個最大的就是第n-1個元素,所以每次它不加一,然後就發現,操作的次數等於a[1]-a[0]+a[2]-a[0]+a[3]-a[0];,就是這個規律吧,讓我找了一晚上

#include#includeusing namespace std;

int a[100004];

int main()

sort(a,a+n);

for(int j=1;j有什麼問題歡迎提問哈

強迫症的序列 牛客網 思維

輸入 第一行乙個整數t t 100 表示組數 對於每組資料有乙個n,表示序列的長度 0 n 100000 下面一行有n個數,表示每個序列的值 0 ai 1000 輸出 兩個數 第乙個數表示最小的操作步數 第二個數經過若干步以後的陣列元素是什麼 例如 1 31 2 3 輸出 3 4 這裡有乙個很奇怪的...

強迫症的序列

小a是乙個中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每乙個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成乙個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n 1個元素加1,但是小a並不能很好的算出最優的解決方...

J 強迫症的序列

題目描述 小a是乙個中度強迫症患者,每次做陣列有關的題目都異常難受,他十分希望陣列的每乙個元素都一樣大,這樣子看起來才是最棒的,所以他決定通過一些操作把這個變成乙個看起來不難受的陣列,但他又想不要和之前的那個陣列偏差那麼大,所以他每次操作只給這個陣列的其中n 1個元素加1,但是小a並不能很好的算出最...