洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
P1368 均分纸牌(加强版)
题目描述
有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,纸牌总数必为 N 的倍数。可以在任一堆上取1张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,能移到编号为 2和N 的堆上;在编号为 N 的堆上取的纸牌,能移到编号为 N-1和1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,使每堆上纸牌数都一样多且牌的移动次数尽量少。
输入输出格式
输入格式:
第一行一个整数n
第二行为n个空格分开的正整数,为n堆纸牌的牌数。
输出格式:
只有一个数,为最少的移动次数。
输入输出样例
4
1 2 5 4
4
说明
对样例的说明:
①第4堆移动1张牌至第1堆
②第3堆移动1张牌至第2堆
③第3堆移动1张牌至第2堆
④第2堆移动1张牌至第1堆
此时移动次数为4最小
【数据范围】
对于40%的数据,n<=10000
对于100%的数据,n<=1000000,所有纸牌数总和在2147483647内
设平均数为xba
不妨设a1给了an x1 张纸牌(k可正可负),a2给了a1 x2张纸牌, a3给了a2 x3 张纸牌……an给了a(n - 1) xn张纸牌,不难发现以下方程:
xba = a1 - x1 + x2
xba = a2 - x2 + x3
xba = a3 - x3 + x4
xba = a4 - x4 + x5
......
xba = a(n - 1) - x(n - 1) + xn
xba = an - xn + x1
把他们全部相加,不难发现
nxba = a1 + a2 + a3 + .... + an
得到0 = 0
毫无用处。
我们考虑最终结果,应该是
|x1| + |x2| + |x3| + .... + |xn|
换元法,得到
ans = |x1| + |xba - a1 + x1| + |2xba -a1 - a2 + x1| + |3xba -a1 - a2 - a3 + x1| + ..... + |(n - 1)xba - Σai,i <= n - 1|转换为一次函数带绝对值的最值问题
数形结合思想,看做是数轴上点的距离。这些点是k * xba - Σai,i <= k
k应为k * xba - Σai,i <= k中的中位数
对于任意数x, x的左边就有m1个点,右边也有m2个点
x向左移动n个单位长度时,它与其他各点距离和变化为:-m1 * n + m2 * n = n(m2 - m1)
x向右移动n个单位长度时,它与其他各点距离和变化为:m1 * n - m2 * n = n(m2 - m1)
当m1 = m2时,距离和变化为0
我们看x在中位数左边一点及其以左时(m2 - m1 > 0),移动到x在中位数位置的偏移值大于零
x在中位数右边一点及其以右时(m1 - m2 > 0),移动到于x在中位数位置的偏移值大于零
因此中位数时距离和最小。
证毕
#include <bits/stdc++.h>
inline void read(long long &x){x = ;char ch = getchar();char c = ch;while(ch > '' || ch < '')c = ch, ch = getchar();while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();if(c == '-')x = -x;}
const int INF = 0x3f3f3f3f;
const int MAXN = + ; long long n,num[MAXN],sum,f[MAXN],xba;
long long k,ans; int main()
{
read(n);
for(register long long i = ;i <= n;++ i)
{
read(num[i]);
sum += num[i];
}
xba = sum / n;
f[] = ;
for(register long long i = ;i <= n;++ i)
{
f[i] = f[i - ] + xba - num[i - ];
}
std::sort(f + , f + + n);
k = f[n/ + ];
for(long long i = ;i <= n;i ++)
{
ans += abs(k - f[i]);
}
printf("%lld", ans);
return ;
}
洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]的更多相关文章
- 洛谷P1390 公约数的和 [2017年6月计划 数论12]
P1390 公约数的和 题目描述 有一天,TIBBAR和LXL比赛谁先算出1~N这N个数中每任意两个不同的数的最大公约数的和.LXL还在敲一个复杂而冗长的程序,争取能在100s内出解.而TIBBAR则 ...
- 洛谷P1573 栈的操作 [2017年6月计划 数论11]
P1573 栈的操作 题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,…,n.每一个栈只支持一种操作:弹出并 压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意 ...
- 洛谷P2429 制杖题 [2017年6月计划 数论10]
P2429 制杖题 题目描述 求不大于 m 的. 质因数集与给定质数集有交集的自然数之和. 输入输出格式 输入格式: 第一行二个整数 n,m. 第二行 n 个整数,表示质数集内的元素 p[i]. 输出 ...
- 洛谷P1147 连续自然数和 [2017年6月计划 数论01]
P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以 ...
- 洛谷P1368 均分纸牌(加强版)
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1164 小A点菜 [2017年4月计划 动态规划08]
P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...
- 洛谷P1244 [NOI2000] 青蛙过河 [2017年4月计划 动态规划07]
P1244 青蛙过河 题目描述 有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示.n只青蛙要过 ...
- 洛谷P1877 [HAOI2012]音量调节 [2017年4月计划 动态规划05]
P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...
- 洛谷P2347 砝码称重 [2017年4月计划 动态规划01]
P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...
随机推荐
- svn使用方法以及使用教程
一.什么是svnSVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 二.svn的下载安装下载地址:https: ...
- FreeMarker 自定义 TemplateDirectiveModel(二)
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...
- nginx源码分析——内存池
内存池的目的就是管理内存,使回收内存可以自动化一些. ngx_palloc.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. * ...
- Elasticsearch template学习
Elasticsearch template Elasticsearch存在一个关键问题就是索引的设置及字段的属性指定,最常见的问题就是,某个字段我们并不希望ES对其进行分词,但如果使用自动模板创建索 ...
- xml中的<if>和截取字符串
<#if (envPollute=='1')>√</#if><#if (envPollute=='0')>√</#if>${as_title?subst ...
- 06_Hibernate缓存
一.缓存概述 什么是缓存: 缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取. 缓存的好处: 提升程序运行的效率.缓存技术是Hibernate ...
- HtmlHelper2
一.隐式从ViewBag取数据 1.action中的代码: ViewBag.UserName = "admin"; cshtml中的代码: @Html.TextBox(" ...
- Foundation框架系列-NSString
NSString OC字符串与C语言字符串转换 NSString *str = @"Hello world ! !"; // OC字符串 --> C语言字符串 char *c ...
- 复制字符串 _strdup _wcsdup _mbsdup
Duplicate strings.函数定义: char *_strdup( const char *strSource ); wchar_t *_wcsdup( const wchar_t *str ...
- python 连接mssql数据库
1.目标数据sql2008 R2 ComPrject=>TestModel 2.安装python 连接mssql 模块 运行 pip install pymssql-2.2.0.dev0-cp3 ...