交叉模擬 均分紙牌

2021-07-26 02:03:15 字數 1358 閱讀 3597

ssl 1023

洛谷 p1031 均分紙牌

題目描述

有 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)。

分析

只要能想到將每堆牌的數量與平均值的差形成乙個正負關係,那就成功了一半!

排序從大到小

於是有這樣的牌堆情況:

-1 2 3 4 平均值2

排序後:4 3 2 -1

然後將4多的部分移到3那裡:

2 5 2 -1

然後將3多的部分移到2那裡:

2 2 5 -1

以此類推:

2 2 2 -1+3=2

就完成了!極其簡單。

var

a:array[1..100]of longint;

n:longint;

procedure

init;

var i,sum:longint;

begin

sum:=0;

readln(n);

for i:=1

to n do

begin

read(a[i]);sum:=sum+a[i]; end;

for i:=1

to n do a[i]:=a[i]-sum div n;

end;

procedure

main;

var i,s:longint;

begin

s:=0;

for i:=1

to n do

if a[i]<>0

then

begin

a[i+1]:=a[i+1]+a[i];

a[i]:=0;

inc(s);

end;

writeln(s);

end;

begin

init;

main;

end.

關卡2 2 交叉模擬 p1031均分紙牌

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

貪心 均分紙牌

時間限制 1 sec 記憶體限制 64 mb 提交 164 解決 95 提交 狀態 討論版 有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編...

均分紙牌問題

有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌的規則為 在編號為1上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編號為n 1的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在要求找出一種移動方法,...