CodeVs 1098 均分紙牌問題

2021-08-14 02:36:45 字數 1491 閱讀 8952

題目描述 description

有 n 堆紙牌,編號分別為 1,2,…, n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。

移牌規則為:在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上;在編號為 n 的堆上取的紙牌,只能移到編號為 n-1 的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。

現在要求找出一種移動方法,用最少的移動次數使每堆上紙牌數都一樣多。

例如 n=4,4 堆紙牌數分別為:

① 9 ② 8 ③ 17 ④ 6

移動3次可達到目的:

從 ③ 取 4 張牌放到 ④ (9 8 13 10) -> 從 ③ 取 3 張牌放到 ②(9 11 10 10)-> 從 ② 取 1 張牌放到①(10 10 10 10)。

輸入描述 input description

第一行n(n 堆紙牌,1 <= n <= 100)

第二行a1 a2 … an (n 堆紙牌,每堆紙牌初始數,l<= ai <=10000)

輸出描述 output description

輸出至螢幕。格式為:

所有堆均達到相等時的最少移動次數。『

樣例輸入 sample input 4

9 8 17 6

樣例輸出 sample output 3

資料範圍及提示 data size & hint e

解析

從最左端開始進行移動,如果第i堆的數目大於平均數,那麼移動數加1,將多出來的移動到下一堆。如果第i堆數目小於平均數,那麼移動數加1,用下一堆補充缺少的數目。下一堆可以為負數,這是這題的關鍵。本題中我們只是改變了移動的次序,而移動的總步數不會發生改變。貪心演算法就是用最簡單的方式讓每一堆去達到它應該達到的值,不要去考慮其他因素,這就是本題的解法,也是貪心演算法的精髓!設a[i]為第i堆紙牌的張數(0<=i<=n),v為均分後每堆紙牌的張數,s為最小移動次數。

我們用貪心演算法,按照從左到右的順序移動紙牌。如第i堆的紙牌數不等於平均值,則移動一次(即s加

1),分兩種情況移動:

1.若a[i]>v

,則將a[i]-v

張從第i

堆移動到第

i+1堆;

2.若a[i],則將

v-a[i]

張從第i+1

堆移動到第i堆。

為了設計的方便,我們把這兩種情況統一看作是將a[i]-v從第

i堆移動到第

i+1堆,移動後有

a[i]=v; a[i+1]=a[i+1]+a[i]-v.

在從第i+1堆取出紙牌補充第

i堆的過程中可能回出現第

i+1堆的紙牌小於零的情況。

源**(更新於2017.12.22)

#include#includeusing namespace std;

int main()

m/=n;

for (i=1;i<=n;i++)

cout

}

codevs 1098 均分紙牌

題目描述 description 有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在編號為 n 的堆上取的紙牌,只能移到編號為 n 1 的堆上 其他堆上取的紙...

codevs 1098 均分紙牌 貪心

2002年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在...

CODEVS 1098 均分紙牌(貪心)

2002年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在...