洛谷P1368 均分纸牌(加强版)
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 我们考虑最终结果,应该是
|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|转换为一次函数带绝对值的最值问题 数形结合思想,看做是数轴上点的距离。
中位数时距离和最小。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1000010
#define INF 0x3f3f3f3f
long long a[maxn],sum,f[maxn],xba,n,k,ans;
int main(){
scanf("%d",&n);
for(long long i=;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
xba=sum/n;
f[]=;
for(long long i=;i<=n;i++)
f[i]=f[i-]+xba-a[i-];
sort(f+,f+n+);
k=f[n/+];
for(long long i=;i<=n;i++)
ans+=abs(k-f[i]);
cout<<ans;
return ;
}
洛谷P1368 均分纸牌(加强版)的更多相关文章
- 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1031 均分纸牌
P1031 均分纸牌 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌 ...
- 洛谷 P1031 均分纸牌
P1031 均分纸牌 这道题告诉我们,对于实在想不出算法的题,可以大胆按照直觉用贪心,而且在考试中永远不要试着去证明贪心算法,因为非常难证,会浪费大量时间. (这就是你们都不去证的理由??) 这道题贪 ...
- 洛谷 P1031 均分纸牌 Label:续命模拟QAQ
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- 洛谷 P1031 均分纸牌【交叉模拟】
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- [NOIP2002] 提高组 洛谷P1031 均分纸牌
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- 洛谷——P1031 均分纸牌
https://www.luogu.org/problem/show?pid=1031#sub 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以 ...
- (Java实现) 洛谷 P1031 均分纸牌
题目描述 有NN堆纸牌,编号分别为 1,2,-,N1,2,-,N.每堆上有若干张,但纸牌总数必为NN的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为11堆上取的纸牌,只能移到编号为 ...
- 最小表示法模板(洛谷P1368 工艺)(最小表示法)
洛谷题目传送门 最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串. 因为是环状的,所以肯定要先转化为序列,把原串倍长. 设决策点为一个表示法的开头.比较两个决策 ...
随机推荐
- JavaScript原理学习
悟透JavaScript(理解JS面向对象的好文章) http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html Javascript ...
- elasticsearch 简单聚合查询示例
因为懒癌犯了,查询语句使用的截图而不是文字,导致了发布随笔的时候提示少于150字的随笔不能发布. 我就很郁闷了. 下面的查询都是前段时间工作中使用过的查询语句. 开始的时候是使用nodejs构建es查 ...
- UVA - 11624 Fire! 【BFS】
题意 有一个人 有一些火 人 在每一秒 可以向 上下左右的空地走 火每秒 也会向 上下左右的空地 蔓延 求 人能不能跑出来 如果能 求最小时间 思路 有一个 坑点 火是 可能有 多处 的 样例中 只有 ...
- gcc error - "iostream: No such file or directory"
#include <iostream> using namespace std; int main(void) { cout<<"Hello World!\n&quo ...
- struts2 codebehind + actionPackages 实现Action零配置
1.jar包:struts2-codebehind-plugin-2.2.1.1.jar 2.struts.xml:<!-- codebehind中查找action的返回结果资源时的默认文件夹 ...
- Mac OS 配置Maven
步骤: 1. 下载Maven tar包 https://maven.apache.org/download.cgi?Preferred=http%3A%2F%2Fmirrors.tuna.tsingh ...
- Log4j2_学习_01_Log4j 2使用教程
一.推荐使用的log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <!-- 设置log4j2的 ...
- overflow:hidden真的失效了吗?
项目中常常有同学遇到这样的问题,现象是给元素设置了overflow:hidden,但超出容器的部分并没有被隐藏,难道是设置的hidden失效了吗? 其实看似不合理的现象背后都会有其合理的解释. 我们知 ...
- Jmeter-聚合报告
线程组右键--添加--监听器--聚合报告 Aggreagete Report:jmeter最常用的一个Listener,“聚合报告”. Label:每个jmeter的element(例如HTTP Re ...
- codeforces 569C C. Primes or Palindromes?(素数筛+dp)
题目链接: C. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes in ...