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