洛谷P1368 均分紙牌(加強版)

2022-04-02 04:11:30 字數 1683 閱讀 6614

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

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

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

輸入格式:

第一行乙個整數n

第二行為n個空格分開的正整數,為n堆紙牌的牌數。

輸出格式:

只有乙個數,為最少的移動次數。

輸入樣例#1:

4

1 2 5 4

輸出樣例#1:

4

對樣例的說明:

①第4堆移動1張牌至第1堆

②第3堆移動1張牌至第2堆

③第3堆移動1張牌至第2堆

④第2堆移動1張牌至第1堆

此時移動次數為4最小

【資料範圍】

對於40%的資料,n<=10000

對於100%的資料,n<=1000000,所有紙牌數總和在2147483647內

/*

設平均數為xba

不妨設a1給了an x1 張紙牌(k可正可負),a2給了a1 x2張紙牌, a3給了a2 x3 張紙牌……an給了a(n - 1) xn張紙牌,不難發現以下方程:

xba = a1 - x1 + x2

xba = a2 - x2 + x3

xba = a3 - x3 + x4

xba = a4 - x4 + x5

......

xba = a(n - 1) - x(n - 1) + xn

xba = an - xn + x1

我們考慮最終結果,應該是

|x1| + |x2| + |x3| + .... + |xn|

換元法,得到

ans = |x1| + |xba - a1 + x1| + |2xba -a1 - a2 + x1| + |3xba -a1 - a2 - a3 + x1| + ..... + |(n - 1)xba - σai,i <= n - 1|轉換為一次函式帶絕對值的最值問題

數形結合思想,看做是數軸上點的距離。

中位數時距離和最小。

*/#include

#include

#include

using

namespace

std;

#define maxn 1000010

#define inf 0x3f3f3f3f

long

long

a[maxn],sum,f[maxn],xba,n,k,ans;

intmain()

xba=sum/n;

f[1]=0

;

for(long

long i=2;i<=n;i++)

f[i]=f[i-1]+xba-a[i-1

]; sort(f+1,f+n+1

); k=f[n/2+1

];

for(long

long i=1;i<=n;i++)

ans+=abs(k-f[i]);

cout

}

洛谷 P1031 均分紙牌

p1031 均分紙牌 這道題告訴我們,對於實在想不出演算法的題,可以大膽按照直覺用貪心,而且在考試中永遠不要試著去證明貪心演算法,因為非常難證,會浪費大量時間。這就是你們都不去證的理由?這道題貪心演算法就是,計算牌的平均數,然後除了最後一堆以外,每堆都通過把多餘牌移到下一堆或從下一堆取牌來使其達到平...

洛谷 P1031均分紙牌

恰似又更了四章 我現在只能期待他不在什麼工作日突然來乙個十篇得大爆更了 我現在要更一篇水題了 希望不會被不小心看到的大佬們嫌棄 題目描述 有n堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號...

洛谷P1031 均分紙牌

題目鏈結 均分紙牌 解題思路 貪心演算法,最簡單的模擬 最壞的情況就是移動n 1次 如果紙牌本來就滿足條件就不需要再移動 預處理就是求每堆紙牌與平均數的關係,多1記為1,少1記為 1 從左至右依次掃瞄,a i 0的就把多的部分給右邊那堆,a i 0的就從右邊那堆拿過來補上 附上 include us...