洛谷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\) 个 词牌名 ,并且她的宋词总共有 ...
随机推荐
- 深入解析QML引擎, 第3部分: 绑定类型
原文 QML Engine Internals, Part 3: Binding Types 译者注:这个解析QML引擎的文章共4篇,分析非常透彻,在国内几乎没有找到类似的分析,为了便于国内的QT/Q ...
- MQ配置安装
一,MQ安装 ./mqlicense.sh -accept rpm -ivh MQSeries*.rpm -- rpm -qa|grep MQSeries 二,MQ配置 环境变量配置(MQM)实际安 ...
- 解析build.gradle文件
Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言DSL来声明项目设置,摒弃了传统XML(如Ant和Maven)的各种繁琐配置 项目结构如上图: 1.最外层目录下的b ...
- Python单元测试--unittest(一)
unittest模块是Python中自带的一个单元测试模块,我们可以用来做代码级的单元测试. 在unittest模块中,我们主要用到的有四个子模块,他们分别是: 1)TestCase:用来写编写逐条的 ...
- sql server 查询所有被锁表并批量解除
废话不多说,直接上代码: --查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) table ...
- 2019展望计划(Lamica 2019-Year Plan):
1,家人身体健康.2,好好上课,考试顺利,不要挂科.3,PETS3 9月份 杭州 一定要过.4,PETS3通过后,进军日语N3-N2.5,在杭州找一份合适的工作(底线6K).6,在杭州交到新朋友.7, ...
- 【TCP_协议_socket接口】-jmeter
1.ip 2.端口号 3.传入参数 4.告诉软件返回 最后以为是什么,不然就会报错 或者无限制的等待 查ascll 码表 启动接口的方法
- Python模块random使用详情
python常用模块目录 1.random.random()#用于生成一个0到1的随机浮点数:0<= n < 1.0 import random mcw = random.random() ...
- Linux下使用vim编辑C程序
这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...
- Java 学习笔记 ------第六章 继承与多态
本章学习目标: 了解继承的目的 了解继承与多态的关系 知道如何重新定义方法 认识java.lang.object 简介垃圾回收机制 一.继承 继承是java面向对象编程技术的一块基石,因为它允许创建分 ...