洛谷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 ...
随机推荐
- Box 'laravel/homestead' could not be found.
vbox vagrant.box Homestead 都安裝好的情況下.在homestead目錄下,執行vagrant up出錯 Homestead\scripts\文件夹中,打开homestead. ...
- iOS绘制线条的使用
1.相关简介 1.1.iOS之UIBezierPath贝塞尔曲线属性简介 1.2.iOS之CAShapeLayer属性简介 2.绘制曲线 2.1.方法详解 - (void)addQuadCurveTo ...
- 《DSP using MATLAB》Problem 8.12
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- vue报错 error: data.push is not a function
data定义出错,data需定义为一个数组 => data : [ ]
- 重装一次CM的坑爹记录
今天同事要对测试环境进行降级(测试高于生产所以要求降级),自己不经常搞运维,但是无奈测试环境没运维管理只能自己上了. 流程和遇到问题按数字表示. 1.重装CM(clouder manager)这个过程 ...
- 如何解决mysql服务器load高
.登录主机 # ssh hostname .确定是否是mysql导致 # top .查看是哪些sql正在慢查询 # mysql -h hostname -P port -u username # sh ...
- linear-gradient
http://jsbin.com/mocojehosa/edit?html,css,output https://developer.mozilla.org/zh-CN/docs/Web/CSS/li ...
- 汇总下几个IP计算/转换的shell小脚本-转
原文:http://blog.chinaunix.net/uid-20788470-id-1841646.html 1. IP转换为整数> vi ip2num.sh#!/bin/bash# ...
- OCP/OCA Oracle 学习001
select * from TEST3 t select object_type, count(object_type) from user_objects group by object_type ...
- sql 书写顺序
SELECT select_list [ INTO new_table ] FROM table_source [ WHERE search_condition ] [ GROUP BY group_ ...