洛谷P2125图书馆书架上的书 题解报告
题目描述
图书馆有n个书架,第1个书架后面是第2个书架,第2个书架后面是第3个书架……第n-1个书架后面是第n个书架,第n个书架后面是第1个书架,第i个书架上有b[i]本书。现在,为了让图书馆更美观,WZF神牛让蒟蒻SY搬动书架上的书,使每个书架上的书一样多。由于搬动的书可能会很多,所以蒟蒻SY只能将一个书架上的书搬到与其相邻的两个书架上。那么蒟蒻SY最少搬动几本书呢?
输入输出格式
输入格式:
共2行,第1行1个正整数n,第2行n个非负整数,第i个为b[i]。
输出格式:
共n+1行,第1行1个正整数m,表示蒟蒻SY最少搬动m本书,之后n行(即第2行至第n+1行)每行2个整数,第i行有两个整数af[i]和ab[i],分别表示蒟蒻SY要将第i个书架上的af[i]本书和ab[i]本书分别搬到它前面的一个书架上和它后面的一个书架上。
输入输出样例
5
15 7 11 3 14
12
2 3
-3 0
0 1
-1 -6
6 -2
说明
n<=5000001(为保证有唯一解,n必为奇数),b[i]<= 21474803648(蒟蒻SY:俺当初一看到这儿就想哭。)
若af[i]为负数,则说明蒟蒻SY要把第i个书架前面的那个书架上的-af[i]本书搬到第i个书架上。
同理,若ab[i]为负数,则说明蒟蒻SY要把第i个书架后面的那个书架上的-ab[i]本书搬到第i个书架上。
题解:
在输入后我们统计求得最终每个书架上的数的数量m
设xi为第i个书架上的书,令xi-=m
我们设ai表示第i个书架向下一个书架移动了几本书
那么移动数ans=|a1|+|a2|+|a3|+|a4|+......+|an| 求最小值
当然那么多的变量不好找关系
由于每个书架上的书最终为m【自减m后最终为0】,那么有xi+a[i-1]-a[i]=0
这样子就有
a1=a1
a2=a1+x2
a3=a2+x3=a1+x2+x3
a4=a3+x4=a1+x2+x3+x4
......
那么ans=|a1|+|a1+x2|+|a1+x2+x3|+|a1+x2+x3+x4|+......
由于xi都为已知的常数,那么我们可以写成这样一个形式:
ans=|a1|+|a1+k1|+|a1+k2|+|a1+k3|+|a1+k4|+......
那么问题就转化成了如何求这堆绝对值的最小值
我们可以数形结合:想一想绝对值的集合意义是什么?
对!就是到原点的距离
我们把每个绝对值里的东西看作数轴上的一个点,那么这些点与a1的相对位置不变
也就是说我们在尝试改变a1的位置以谋求所有点到原点的距离和最小
当我们把a1向左移时,原点左边的点远离原点,原点左边的点接近原点,也就是说,【因为点数为奇数】当所有点的中位点处于原点时,ans就是最小的
这个时候问题就变得很简单啦,求出算出关于x的前缀和,然后排序求出中间点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long int
using namespace std;
const int maxn=5000005,INF=200000000; inline LL read(){
LL out=0,flag=1;char c=getchar();
while(c<48||c>57) {if(c=='-') flag=-1;c=getchar();}
while(c>=48&&c<=57) {out=out*10+c-48;c=getchar();}
return out*flag;
} LL A[maxn],sum[maxn],temp[maxn],N,tot=0; int main()
{
N=read();
for(int i=1;i<=N;i++) tot+=(A[i]=read());
tot/=N;
A[1]-=tot;
for(int i=2;i<=N;i++){
A[i]-=tot;
temp[i]=sum[i]=sum[i-1]+A[i];
}
sort(temp+1,temp+1+N);
LL mid=-temp[(N>>1)+1],ans=0;
for(int i=1;i<=N;i++) ans+=abs(mid+sum[i]);
printf("%lld\n",ans);
for(int i=1;i<=N;i++){
printf("%lld %lld\n",-(mid+sum[i-1 ? i-1:N]),mid+sum[i]);
}
return 0;
}
这道题还是给了我们很多的思路,尤其是绝对值的几何意义,这可以给我们解题更多的启发
洛谷P2125图书馆书架上的书 题解报告的更多相关文章
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- 洛谷P2125 题解
吐槽: 只能说这道题很数学,本数学蒟蒻推了半天没推出来,只知道要用绝对值,幸亏教练提醒,才勉强想出正解(似乎不是这样的),真的是很无语. 以上皆为吐槽本题,可直接 跳过 分析: 既然题目是要使书架上的 ...
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)
[NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...
- BZOJ5288 & 洛谷4436 & LOJ2508:[HNOI/AHOI2018]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5288 https://www.luogu.org/problemnew/show/P4436 ht ...
- BZOJ3675 & 洛谷3648 & UOJ104:[Apio2014]序列分割——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3675 https://www.luogu.org/problemnew/show/P3648 ht ...
- 洛谷3258:[USACO2012 MAR]Flowerpot 花盆——题解
https://www.luogu.org/problemnew/show/P2698#sub 老板需要你帮忙浇花.给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置. 每滴水以每秒1个单位 ...
- 【洛谷】CYJian的水题大赛 解题报告
点此进入比赛 \(T1\):八百标兵奔北坡 这应该是一道较水的送分题吧. 理论上来说,正解应该是DP.但是,.前缀和优化暴力就能过. 放上我比赛时打的暴力代码吧(\(hl666\)大佬说这种做法的均摊 ...
- 洛谷P5664 Emiya 家今天的饭 题解 动态规划
首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...
随机推荐
- html学习第一天
由于之后想做个网站,所以web前端的也要学习一下. 昨天看了一下html,今天做一下记录. 首先是安装工具,用文本编辑器有点麻烦,我选择的是强大的 Dreamweaver CS6,不过大家喜欢文本编辑 ...
- Maven学习(十八)-----Maven依赖管理
其中一个Maven的核心特征是依赖管理.管理依赖关系变得困难的任务一旦我们处理多模块项目(包含数百个模块/子项目). Maven提供了一个高程度的控制来管理这样的场景. 传递依赖发现 这是很通常情况下 ...
- Java飞机大战MVC版
PlaneWar Java飞机大战MVC版 //无聊时偷的雷霆战机素材写了一个飞机大战,本意是练习mvc,但写得还是不清晰 github下载:https://github.com/dejavudwh/ ...
- 面向对象编程(OOP)思想小结
Concepts 类(class):对我们要解决问题的抽象,比如建造房子的蓝图:但实现机制上来讲,类是根据蓝图构建而成的,存储在内存中的,用来表示对象的数据. 对象(object):根据类构建的实体, ...
- Python爬虫入门(7):正则表达式
下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串” ...
- 作业2-MathExam V2.0
MathExam V2.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 20 50 • ...
- Right-BICEP 测试四则运算程序
测试方法: Right-BICEP 测试计划: 1.边界测试是否正确 2.负数表示是否实现 3.是否有乘除法 4.是否可以选择题目数量 5.是否有输出方式 6.是否有括号 7.是否有重复查询 ...
- Alpha冲刺总结报告
一.项目预期计划 允许粗糙的美工设计.由于是毫无经验的人生第一次,必定在开发过程中会遇到许多的问题,因而我们必定会花费不少时间在学习和debug上. 实现除了他山之石和规则系统以外的所有内容. 在日历 ...
- css全局样式基础代码
body{ font-size:12px; font-family:"宋体",Arial, Helvetica, sans-serif;color:#363636;backgrou ...
- 第7章 监听器Listener
Listener概述 Listener的使用 使用Listener需要实现相应的Listener接口. public class SessionListenerTest implements Http ...