[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 为平均分配后每个人的糖果数量。
答案 Ans 就为 Σ | f[i] | ,从 n 到 1 依次求 f[i] 即可。
再回到 BZOJ-1045 这道题。
令 f[i] 表示第 i 个人从第 i-1 个人那里获取的糖果数量。特别地,f[1] 表示第 1 个人从第 n 个人那里获取的糖果数量。
一旦我们确定其中的任何一个 f[i] ,其他的所有 f[i] 也就都随之确定了。
令 g[i] = f[i] - f[i - 1] ( 1 < i <= n ) ,那么 f[i] = S[i] + f[1] ,其中 S[i] = Σ g[j] ( 1 < j <= i ) 。特别地,S[1] = 0 。
那么最后的答案 Ans = Σ | S[i] + f[1] | = Σ | S[i] - (-f[1]) | ,即为 S[i] 到 -f[1] 的距离和。
可以发现 g[i] = f[i] - f[i-1] = f[i] - [K - (A[i-1] - f[i])] = A[i-1] - K 。
那么 g[i] , S[i] 的值都是固定的,与 f[1] 无关,问题转化为求一个数轴上的点,使数轴上 n 个定点到它的距离和最小。
我们知道,当这个动点为 n 个定点的中位数时,距离和最小。
那么就很容易写出代码。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 1000000 + 5; int n; typedef long long LL; LL Tot, K, Ans, f1;
LL A[MaxN], g[MaxN], S[MaxN]; inline LL Abs(LL x) {
return x > 0ll ? x : -x;
} int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &A[i]);
Tot += A[i];
}
K = Tot / (LL)n;
for (int i = 2; i <= n; i++) g[i] = A[i - 1] - K;
S[1] = 0;
for (int i = 2; i <= n; i++) S[i] = S[i - 1] + g[i];
sort(S + 1, S + n + 1);
f1 = -S[(n + 1) >> 1];
Ans = 0ll;
for (int i = 1; i <= n; i++) Ans += Abs(S[i] + f1);
printf("%lld\n", Ans);
return 0;
}
[BZOJ 1045] [HAOI2008] 糖果传递的更多相关文章
- BZOJ 1045: [HAOI2008] 糖果传递 数学
1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐 ...
- bzoj 1045: [HAOI2008] 糖果传递 贪心
1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1812 Solved: 846[Submit][Stat ...
- bzoj 1045 [HAOI2008] 糖果传递——设变量推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 费用流TLE. #include<iostream> #include&l ...
- BZOJ 1045 [HAOI2008]糖果传递 ★(环形等分:中位数)
题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 假设平均数是x,且a1给an了k个(k<0说明是an给a1了-k个),那么总代价就 ...
- bzoj 1045 [HAOI2008] 糖果传递 —— 贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656 ...
- bzoj 1045: [HAOI2008] 糖果传递【瞎搞】
感觉我的智商可能不够写题解,就直接截了hzwer的blog 地址http://hzwer.com/2656.html #include<iostream> #include<cstd ...
- 【BZOJ 1045】 1045: [HAOI2008] 糖果传递
1045: [HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n& ...
- 【BZOJ】1045: [HAOI2008]糖果传递(中位数)
http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include < ...
- 1045: [HAOI2008] 糖果传递 - BZOJ
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1.Input 小朋友个数n 下面n行 aiOutput 求使所有人获得均等糖果的 ...
随机推荐
- 2014 百度之星题解 1002 - Disk Schedule
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...
- Data Types in the Kernel <LDD3 学习笔记>
Data Types in the Kernel Use of Standard C Types /* * datasize.c -- print the size of common data it ...
- 用tsung测试openfire 服务器性能
最近公司需要做一个有聊天功能的应用,客户讲的是很宏大,用户超多,以前搞过openfire,但没有深入的去了解,就想用它来搞,而且是用 java写的,想扩展也容易些,但在性能上一直担忧,想测试一下它的性 ...
- oracle知识杂记
索引类型 1.B-树索引 分区索引.压缩索引.函数索引等都属于B-树索引 2.位图索引 3.索引组织表 索引管理 1.普通单列索引 对where条件.group ...
- 4G上网卡NIDS拨号之Rmnet驱动
4G上网卡一般为双对外通讯口,一个是串口.一个是USB. 但是基于串口的常用波特率为115200,速度过于底下,所以大多使用USB. 1)一般来说常用ppp拨号方式,ppp拨号方式分为应用层pppd与 ...
- Oracle 汉字在不同字符集下所占字节
今天发现了一个问题,一个长度设置为2000字节的字段,插入一条长度为1000的汉字数据,竟然报错了. 一个汉字占两个字节,按理说刚好是2000个字节.但通过查看日志,发现插入数据的长度为3000字节. ...
- javascript 【js‘s word】
http://mp.weixin.qq.com/s?__biz=MjM5MzY2NDY0Ng==&mid=214013689&idx=1&sn=21e03f6c7bf73893 ...
- 在VS中关于MySQL的相关问题
最近在vs上折腾mysql数据库 遇到了一些小问题,这里记录一下 问题一:数据源选择中没有mysql数据库的选项 解放方法: 1.安装MySql的VS插件(版本请下载最新版)mysql-for-vis ...
- 关于AVD不能导入文件的解决方案
安卓虚拟机导入文件时报以下异常: [2013-01-23 16:09:18 - ddms] transfer error: Read-only file system [2013-01-23 16:0 ...
- C#当中的多线程_线程同步
第2章 线程同步 原来以为线程同步就是lock,monitor等呢,看了第二章真是大开眼界啊! 第一章中我们遇到了一个叫做竞争条件的问题.引起的原因是没有进行正确的线程同步.当一个线程在执行操作时候, ...