BZOJ1045 HAOI2008 糖果傳遞


前段時間TYVJ的某場模擬賽好似有這個題、、模型就是環形的均分紙牌、、

這個題目其實主要是數學分析啦、、

從線性的均分紙牌出發、令a[i]為紙牌樹,k為每堆的目標牌數、

記p[i]=k-a[i]+p[i-1] 含義就是第i堆需要從后一堆拿的紙牌、

那么對p數組求和就是答案了、

對這個環形的、我們這樣考慮、

記sum[i]=sigma(p[j]-p[j-1])  j<=i 那么可以得到p[1]=p[i]-sum[i] 即 p[i]=sum[i]+p[1]

又因為最后的答案ans=sigma p[i]=sigma (s[i]+p[1]) 即數軸上s數組的點到-p[1]的距離之和、

而s數組中的值的集合在取任一點為起點的時候都是不變的、

所以當p[1]為該數組中的中位數時ans最小、

剩下的就是寫代碼啦~

 

Code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>

using namespace std;

int a[1000001],p[1000001];
long long ans,tot,now,n;

int main(){
	scanf("%d",&n);
	for (int i=0;i<n;i++) scanf("%d",&a[i]),tot+=a[i];
	tot/=n;
	for (int i=1;i<n;i++) p[i]=p[i-1]+tot-a[i];
	sort(p,p+n);
	now=p[n/2];
	for (int i=0;i<n;i++) ans+=abs(p[i]-now);
	printf("%lld\n",ans);
	//while(1);
	return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM