bzoj1045糖果传递

xqmmcqs xqmmcqs     2022-08-10     557

关键词:

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045

题解:

  完全不求知怎么推导,于是引用hzw大犇的题解:

  首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示。
  假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1个小朋友给了第i个小朋友Xi颗糖果,X1表示第一个小朋友给第n个小朋友的糖果数量。 所以最后的答案就是ans=|X1| + |X2| + |X3| + ……+ |Xn|。
  对于第一个小朋友,他给了第n个小朋友X1颗糖果,还剩A1-X1颗糖果;但因为第2个小朋友给了他X2颗糖果,所以最后还剩A1-X1+X2颗糖果。根据题意,最后的糖果数量等于ave,即得到了一个方程:A1-X1+X2=ave。
  同理,对于第2个小朋友,有A2-X2+X3=ave。最终,我们可以得到n个方程,一共有n个变量,但是因为从前n-1个方程可以推导出最后一个方程,所以实际上只有n-1个方程是有用的。
  尽管无法直接解出答案,但可以用X1表示出其他的Xi,那么本题就变成了单变量的极值问题。
  对于第1个小朋友,A1-X1+X2=ave  ->  X2=ave-A1+X1 = X1-C1(假设C1=A1-ave,下面类似)
  对于第2个小朋友,A2-X2+X3=ave  ->  X3=ave-A2+X2=2ave-A1-A2+X1=X1-C2
  对于第3个小朋友,A3-X3+X4=ave  ->  X4=ave-A3+X3=3ave-A1-A2-A3+X1=X1-C3
  ……
  对于第n个小朋友,An-Xn+X1=ave。
  我们希望Xi的绝对值之和尽量小,即|X1| + |X1-C1| + |X1-C2| + ……+ |X1-Cn-1|要尽量小。注意到|X1-Ci|的几何意义是数轴上的点X1到Ci的距离,所以问题变成了:给定数轴上的n个点,找出一个到他们的距离之和尽量小的点,而这个点就是这些数中的中位数,证明略。
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define MAXN 10000000
 5 int n,ave,a[MAXN],c[MAXN];
 6 long long sum,ans;
 7 int main()
 8 {
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++)
11     {
12         scanf("%d",&a[i]);
13         sum+=a[i];
14     }
15     ave=sum/n;
16     for(int i=2;i<=n;i++)
17     {
18         c[i]=c[i-1]+a[i]-ave;
19     }
20     sort(c+1,c+n+1);
21     int mid=c[(n>>1)+1];
22     for(int i=1;i<=n;i++)
23         ans+=abs(c[i]-mid);
24     printf("%lld",ans); 
25     return 0;
26 }

bzoj1045糖果传递

...,于是引用hzw大犇的题解:  首先,最终每个小朋友的糖果数量可以计算出来,等于糖果总数除以n,用ave表示。  假设标号为i的小朋友开始有Ai颗糖果,Xi表示第i个小朋友给了第i-1个小朋友Xi颗糖果,如果Xi<0,说明第i-1... 查看详情

bzoj1045:[haoi2008]糖果传递(数论)

1045:[HAOI2008]糖果传递题目:传送门(双倍经验3293) 题解:  一开始想着DP贪心一顿乱搞,结果就GG了    十分感谢hzwer大佬写的毒瘤数论题解:  首先,最终每个小朋友的糖果数量可以计算出来,等于糖果... 查看详情

bzoj1045[haoi2008]糖果传递

环形均分纸牌问题。用A[i]表示糖果数,sum表示目标的糖果数量。用X[i]表示从i+1移动到i的糖果的个数(可+可-)。由此可以得到式子A[i]+X[i]-X[i-1]=sum。我们可以得到这样的n-1个方程(第n个可以由前n-1个推导)。但是这样不足以求... 查看详情

bzoj1045糖果传递(代码片段)

真·水题。环形均分纸牌模板题。只需求出前缀和,然后取中位数求二重前缀和即可。1#include<cstdio>2#include<algorithm>3usingnamespacestd;4typedeflonglongLL;5constintN=1000010;6LLa[N],sum[N];7intmain()8intn;9scanf("%d",&n);10fo 查看详情

贪心bzoj1045:[haoi2008]糖果传递(代码片段)

...贪心思考过程Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个... 查看详情

bzoj-1045-[haoi2008]糖果传递(中位数原理)

Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的... 查看详情

bzoj1045糖果传递

...们可以设i个人开始有ai个糖然后设第i个人给前一个人的糖果数为gi则a[i]-g[i]+g[i+1]=avg;avg为最终每个人的糖果数即平均值得到最终答案为所有abs(g[i])设p数组表示a1+...+a[i]-i*avg 则a[1]-g[1]+g[2]=avg→g[2]=avg-a[1]-g 查看详情

bzoj1045[haoi2008]糖果传递

传送门很久以前写过的题,忘得一干二净。题解//Twenty#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include< 查看详情

[bzoj1045][洛谷p2512][haoi2008]糖果传递

Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的... 查看详情

bzoj1045题解

1045:[HAOI2008]糖果传递TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 3502  Solved: 1623[Submit][Status][Discuss]Description  有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一 查看详情

bzoj1045[haoi2008]糖果传递

...意【题解】思路来自hzwer..设xi表示第i个人往左传递了xi个糖果。(如果小于0表示旁边的人给他了糖果。则ans=∑|xi|最后所有人的糖果数都变成sum/n->avg则a1-x1+x2=avga2-x2+x3=avg...然后可以用avg和x1来表示所有的x2...xn比如x2=x1-(avg-a1)x3=x1... 查看详情

[bzoj1045][haoi2008]糖果传递数学

...像,想一想很容易理解。设最后每个小朋友能得到$ave$个糖果,所以有$a[i]+x[i]-x[i+1]=ave$。写出每一个形如这样的式子,可以消元得到$x[n]=x[1]+(n-1)*ave 查看详情

bzoj1045[haoi2008]糖果传递——贪心(代码片段)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045好像是贪心...但这是一个环...看博客:http://hzwer.com/2656.html真是神奇的构造...还是应该大胆地先把各种变量都设出来再处理。代码如下:#include<iostream>#include<cstdio>#include<c... 查看详情

bzoj1045[haoi2008]糖果传递排序(代码片段)

题面题目传送门解法环形均分纸牌和这道题是一模一样的时间复杂度:(O(nlog))代码#include<bits/stdc++.h>#defineintlonglong#defineN1000010usingnamespacestd;template<typenamenode>voidchkmax(node&x,nodey)x=max(x,y);temp 查看详情

bzoj1045:[haoi2008]糖果传递&&bzoj3293:[cqoi2011]分金币

...是绝望的。。首先我们可以先求出每个小朋友应该得到的糖果数,就是平均值,然后ave-a[i]就代表要从其他小朋友那得到多少个糖果(如果是负数就是要送出糖果)然后求前缀和,往前面延伸,将值想象成数轴上的点,数轴上任... 查看详情

bzoj1145--糖果传递(贪心)

1045:[HAOI2008]糖果传递TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 4394  Solved: 2155[Submit][Status][Discuss]Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖 查看详情

[bzoj1045][haoi2008]糖果传递(代码片段)

Description有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。Input第一行一个正整数nn<=1‘000‘000,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的... 查看详情

bzoj1045:[haoi2008]糖果传递(代码片段)

...掉一个跑贪心?O(n^2)超时了。。。先计算m为每个最终糖果数量。设An传给A1了k个糖果,那么A1传给A2的糖果数为S1=k+A1-m,T1=A1-m那么A2传给A3的糖果数为S2=k+A1+A2-2*m,T2=A1+A2-2*m那么A3传给A4的糖果数为S3=k+A1+A2+A3-3*m,T3=A1+A2+A3-3*m...那么A... 查看详情