吐槽:

只能说这道题很数学,本数学蒟蒻推了半天没推出来,只知道要用绝对值,幸亏教练提醒,才勉强想出正解(似乎不是这样的),真的是很无语。


以上皆为吐槽本题,可直接 跳过

分析:

  • 既然题目是要使书架上的书一样多,那么就一定要求平均数了

    \(s=\sum_{i=1}^n book_i,s=s\div n\),\(s\)即为平均数

  • 继续分析,我们将平均数减掉,得出一个书架需要改变的量\(x_1,x_2,\)···\(x_n\),这时我们发现,我们可以得出一个方程组

    \(\begin{cases}x_1=a_1-a_n\\x_2=a_2-a_1 \\x_3=a_3-a_2\\\cdots\\x_n=a_n-a_{n-1}\end{cases}\)

    $\Longrightarrow $

    \(\begin{cases}a_1=x_1+a_n\\a_2=x_2+a_1 \\a_3=x_3+a_2\\\cdots\\a_n=x_n+a_{n-1}\end{cases}\)

    (其中\(a_i\)(\(i\in N^+\))为SY从\(i\)书架向下一个书架抱\(a_i\)本书)

    我们惊喜的发现,我们得出了这样一个方程组 \(\begin{cases} a_1=x_1+a_n\\ a_2=x_2+x_1+a_n\\ a_3=x_3+x_2+x_1+a_n\\ \cdots\\a_n=x_n+x_{n-1}+\cdots+x_1+a_n\end{cases}\)

  • 得出以上方程之后,继续观察,发现第一问:SY最少抱多少本书,即求\(sum=\sum_{i=1}^n \left | a_i \right |\)的最小值(\(\left | a_i \right |\)表示数\(a_i\)的绝对值)

    得:\(sum= \left |y_1+a_n \right |+\left | y_2+a_n \right |+\left | y_3+a_n \right |+\cdots+\left | y_n+a_n \right |\)

    \(\because n \in E\)(\(E\)表示奇数集)

    \(\therefore\)当\(a_n=y_k\)(其中\(k=\frac{n}{2}+1\))时,\(sum\)有最小值。

    第一问迎刃而解~~~

  • 剩下的便变得简单起来

    因为我们\(a_i\)设的是SY从\(i\)书架抱到到下一个书架的书籍

    所以SY从\(i\)书架抱到到上一个书架的书籍为\(-a_{i-1}\)


部分代码

1.前缀和:

用于求\(y_i\)

for(LL i=1;i<=n;i++)
{
sum[i]=sum[i-1]+book[i]-s; //前缀和标准写法
}

2.中位数:

用于求\(a_n\)

这里有两种方法:

  • 法一:排序+查找(时间代价:总程序32ms)
sort(sum+1,sum+n+1);
LL mid=sum[n/2+1];//中位数
  • 法二:nth_element(c++自带函数库,时间代价:总程序12ms)
nth_element(sum+1,sum+n/2+1,sum+n+1);
LL mid=sum[n/2+1];//更快的中位数求法

综上,nth_element要快很多,我的名字果然牛逼

具体用法:nth_element(头位置,中位数位置,尾位置);


好吧,这道题数学分析很难,但代码确实很简单,比AC自动机,FFT,那些好多了

给你一个假代码(逃

#include<bits/stdc++.h>
#define LL long long
#define Maxn 5000011
#define QwQ 1
#define QAQ 0
using namespace std;
int n;
LL book[Maxn];
LL s=0;
LL sum[Maxn];
LL s2=0;
LL veb[Maxn];
int main()
{
cin>>n;
for(LL i=1;i<=n;i++)
{
scanf("%lld",&book[i]);
s+=book[i];
}
s/=n;//平均数
for(LL i=1;i<=n;i++)
{
sum[i]=sum[i-1]+book[i]-s;
book[i]=sum[i];
}
sort(sum+1,sum+n+1);
LL mid=sum[n/2+1];//中位数
/*
nth_element(sum+1,sum+n/2+1,sum+n+1);
LL mid=sum[n/2+1];更快的中位数求法
*/
for(LL i=1;i<=n;i++)
{
s2+=abs(sum[i]-mid);
veb[i]=book[i]-mid;
}
printf("%lld\n",s2);
printf("%lld %lld\n",-veb[n],veb[1]);
for(LL i=2;i<=n;i++)
{
printf("%lld %lld\n",-veb[i-1],veb[i]);
}
return mid==0?max(QwQ,QAQ):0;
}

最新文章

  1. SharePoint 2013 JavaScript 对象判断用户权限
  2. JS代码判断字符串中有多少汉字【转】
  3. Nginx架构的企业级应用
  4. 在Mac OS X中搭建STM32开发环境(1)
  5. 关于width与padding
  6. 团队工作准则&amp;贡献分配规则
  7. Django2.1,Xadmin2.0下的问题记录
  8. python pyqt4问题记录
  9. 使用ROME解析rss,如何获取icon图标
  10. [转]复制、移动和删除:cp, rm, mv
  11. 利用SIFT进行特征匹配
  12. strut2的核心知识和工作原理
  13. nginx location正则写法
  14. mysql升级到5.6源
  15. CSS伪代码
  16. ElasticSearch学习笔记--1、安装以及运行
  17. zoj 3299(区间改动+离散化)
  18. ansible安装和配置
  19. [转]Mac上的抓包工具Charles
  20. 北京儿研所自制药一览表,宝妈们必读!&lt;转&gt;

热门文章

  1. 安装R和Rstudio后,Rstudio出现空白和fatal error问题
  2. 黑马程序员_ADO.Net(ExecuteReader,Sql注入与参数添加,DataSet,总结DataSet与SqlDataReader )
  3. Codeforces 782B:The Meeting Place Cannot Be Changed(三分搜索)
  4. LightGBM,面试会问到的都在这了(附代码)!
  5. 自动化冒烟测试 Unittest , Pytest 哪家强?
  6. JVM中有哪些内存区域,分别是用来干什么的
  7. 如何在一个项目中兼容Wepy和Taro?
  8. HDFS的HA(高可用)
  9. [leetcode] 290. Word Pattern (easy)
  10. cve-2018-14515复现