[HAOI2008]糖果传递

  大白书上的题,不想再写上来了。

  总结一下这种题的方法吧。

  最重要的就是表达。

  单个对象的表达,到整体的表达。

  用清晰简单的数学形式表达。

  再通过形式的转化找到单个对象之间的联系与规律,继而找到突破口。

  最后这道题还是很灵活的啊,绝对值转数轴点距,以及中位数的应用,我是觉得推出来不简单。

  30分暴力的话,只要枚举断点,把环变成线,之后按均分纸牌的贪心应该就可以了,时间复杂度 O ( n2 ) 。

// q.c

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int M=1000000+10;
int n; long long a[M],sum,ans,mid;
int main() {
	freopen("candya.in","r",stdin);
	freopen("candya.out","w",stdout);
	scanf("%d",&n);
	for(int i=2;i<=n+1;i++) scanf("%lld",&a[i]),sum+=a[i],a[i]+=a[i-1];
	sum/=n;
	for(int i=2;i<=n;i++) a[i]-=(i-1)*sum;
	sort(a+1,a+n+1);
	mid=a[n/2+1];
	for(int i=1;i<=n;i++) ans+=abs(a[i]-mid);
	printf("%lld\n",ans);
	return 0;
}

 

posted @ 2018-04-12 08:29  qjs12  阅读(96)  评论(0编辑  收藏  举报