[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 求使所有人获得均等糖果的 ...
随机推荐
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
iBatis的sqlMap配置文件的selectKey元素有个type属性,可以指定pre或者post表示前生成(pre)还是后生成(post). Oracle设置 <!-- Oracle SE ...
- mysql加入�管理员
1.首先用超级管理员登录,然后点击权限button 2.点击加入�新用户,填写登录名和password,全局权限不用选,点击新建用户button 3.编辑新加入�的用户(编辑权限) 4.找到" ...
- select 中使用 case when 和 replace
在SELECT中,用CASE 例如: select a.Cname as Tcomname,b.Cname as TGoodname,D.nQuanty,c.cNote ...
- SqlServer循环读取配置
USE [DB_JP_BaseInfo00] GO /****** Object: StoredProcedure [dbo].[sp_wx_getAppointmentInfo_Str] Scrip ...
- jQuery模拟页面加载进度条
因为我们无法通过任何方法获取整个页面的大小和当前加载了多少,所以想制作一个加载进度条的唯一办法就是模拟.那要怎么模拟呢? 我们知道,页面是从上往下执行的,也就是说我们可以大致估算出在页面的某个位置加载 ...
- js 的执行过程
step 1. 读入第一个代码块. step 2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到step5. step 3. 对var变量和function定义做"预编译 ...
- Chart图形 [GDI+] OWCChart统计图的封装类 (转载)
点击下载 OWCChart.zip 利用OWC11进行作统计图的封装类. /// <summary> /// 类说明:进行作统计图的封装类 /// 联系方式:361983679 /// 更 ...
- mvc5 + ef6 + autofac搭建项目(repository+uow)(二)
续上篇: DBContext 在上篇 图一类库根目录创建的 DbContextBase /// <summary> /// 数据库上下文基类 /// </summary> // ...
- SOA,ESB 与 SCA
SOA,ESB与 SCA SOA 与 ESB SOA(Service Oriented Architecture),面向服务体系结构,是一种组件模型架构,一种支撑软件运行的相对稳定的结构.其本质是一种 ...
- 一、C# 概述
1.托管执行环境 2.程序集 3.关键字:C#保留字 4.除了C#定义的关键字之外,开发者可以提供他们自己的名称,编程语言将这些名称称为标识符 5.如果关键字包含一个"@"前缀,那 ...