bzoj 1045

确定初始状态(n与1直接谁给了谁几个),后面的就确定了,再根据总结出来的东西决定前面谁给谁几个最优。

n=1000000!!!

 1 /**************************************************************
 2     Problem: 1045
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:1852 ms
 7     Memory:12524 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12 #define maxn 1000010
13 using namespace std;
14
15 int n;
16 int a[maxn];
17 long long s[maxn], sum, mv;
18
19 int main() {
20     scanf( "%d", &n );
21     for( int i=1; i<=n; i++ ) {
22         scanf( "%d", a+i );
23         sum += a[i];
24     }
25     sum /= n;
26     for( int i=1; i<=n; i++ )
27         a[i] -= sum;
28     for( int i=1; i<=n; i++ )
29         s[i] = s[i-1]+a[i];
30     int mid = (1+n)>>1;
31     nth_element( s+1, s+mid, s+1+n );
32     mv = s[mid];
33     long long ans = 0, ta;
34     for( int i=1; i<=n; i++ ) {
35         ta = s[i]-mv;
36         if( ta<0 ) ta=-ta;
37         ans += ta;
38     }
39     printf( "%lld\n", ans );
40 }

时间: 2024-12-27 12:23:18

bzoj 1045的相关文章

[BZOJ 1045] [HAOI2008] 糖果传递

题目链接:BZOJ 1045 Attention:数据范围中 n <= 10^5 ,实际数据范围比这要大,将数组开到 10^6 就没有问题了. 我们先来看一下下面的这个问题. 若 n 个人坐成一行,不围成圈,那么我们可以用 f[i] 来表示第 i 个人需要从第 i-1 个人那里获得多少个糖果.(这就是“均分纸牌”那道题) 当 f[i] < 0 时,表示第 i 个人需要给第 i-1 个人 | f[i] | 个糖果. 那么 f[i] = K - (A[i] - f[i+1]) ,其中 K 为平均分

bzoj 1045 糖果传递

题目链接: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|

BZOJ 1045 题解

1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3502  Solved: 1623[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Outpu

BZOJ 1045 糖果传递 题解 【递推乱搞就对了

1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3505  Solved: 1626[Submit][Status][Discuss] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数. Outpu

bzoj 1045: [HAOI2008] 糖果传递 贪心

1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Status] Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 小朋友个数n 下面n行 ai Output 求使所有人获得均等糖果的最小代价. Sample Input 4 1 2 5 4 Sample Output 4

bzoj 1045 [HAOI2008] 糖果传递 —— 贪心

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

[BZOJ]1045 圆上的整点(HAOI2008)

数学题第二弹! Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 一个正整数r. Output 整点个数. Sample Input 4 Sample Output 4 HINT r<=2000 000 000 Solution 小C不想写题解啊啊啊啊!!!! 题解在这里啊啊啊啊!!!!(看完记得投币!!!!) 我爱数学啊啊啊啊!!!! 开玩笑的,还是说一说题解吧. 相信如果你认真看完了上面那个视频的前25min,心里肯定已经有不下一

【BZOJ 1045】 [HAOI2008] 糖果传递

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 思路来自hzwer.. 设xi表示第i个人往左传递了xi个糖果. (如果小于0表示旁边的人给他了糖果. 则ans=∑|xi| 最后所有人的糖果数都变成sum/n->avg 则 a1-x1+x2 = avg a2-x2+x3= avg ... 然后可以用avg和x1来表示所有的x2...xn 比如 x2 = x1-(avg-a1) x3 = x1-(2avg-a1-a2) .... 会发现x1右边的式子都是常量. 且都是x1-ci

bzoj 1045 [HAOI2008] 糖果传递 排序

题面 题目传送门 解法 环形均分纸牌 和这道题是一模一样的 时间复杂度:\(O(n\ log\ n)\) 代码 #include <bits/stdc++.h> #define int long long #define N 1000010 using namespace std; template <typename node> void chkmax(node &x, node y) {x = max(x, y);} template <typename node