有 n 堆紙牌,編號分別為 1,2,…, n。每堆上有若干張,紙牌總數必為 n 的倍數。可以在任一堆上取1張紙牌,然後移動。
移牌規則為:在編號為 1 堆上取的紙牌,能移到編號為 2和n 的堆上;在編號為 n 的堆上取的紙牌,能移到編號為 n-1和1 的堆上;其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。
現在要求找出一種移動方法,使每堆上紙牌數都一樣多且牌的移動次數盡量少。
輸入格式:
第一行乙個整數n
第二行為n個空格分開的正整數,為n堆紙牌的牌數。
輸出格式:
只有乙個數,為最少的移動次數。
輸入樣例#1:
41 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...