[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;
}

浙公网安备 33010602011771号