环形均分纸牌问题应该不少人都很熟悉了,而且题解区写的也比较全了......

我这篇题解主要是介绍一个新的STL——nth_element

以及解答几个其他题解里面有应用但是没有注释的问题。(比如说我第一次看就十分懵逼)

如果从第i个人开始转手,那么他们的前缀和分别为

s[i+1]-s[i]

s[i+2]-s[i]

......

s[n]-s[i]

s[1]+s[n]-s[i]

......

s[i]+s[n]-s[i]

因为是均分,所以满足s[n]恒等于0,所以加和可得最小数量:\(\sum_{i=1}^n\)abs(s[i]-s[k])

(为什么数量是前缀和相加呢,因为当轮到自己的时候前面应该已经均分过了,将自己和前面看作一个整体,而这时就必须要下一个进行交换,使得自己的体系平均下来和均值相等,而这个和均值相差的值,自然就是abs(前缀和)了,所以最后我们将它累加,就是答案。)

显然当s[k]取中位数时数量最小。

(而为什么有这个显然呢,借用别的dalao的话来说就是:原因各位可以想象将 S[i] 投影到一个坐标平面内。然后我们用一条线去扫,点到线的距离之和就是上面的式子的最小值。从中位数的位置变化到靠下的位置或是靠上的位置,都会使某一部分点的距离增大。)

STL中的nth_element()方法的使用:

通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序

但是明明已经有了sort排序,为什么要用这个呢——因为这个的时间复杂度比sort优,是log(n)级别的,显然更快一点。

我的代码中将每一项都减去了平均值,其实减不减无所谓,减掉反而又有一点多此一举了.......

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXN 1000010
using namespace std;
int n;
long long a[MAXN],s[MAXN],sum=0,ans=0;
int main(){
while(scanf("%d",&n)!=EOF)
{
//scanf("%d",&n);
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
sum=0; ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
sum=sum/n;
for(int i=1;i<=n;i++)
{
a[i]-=sum;
s[i]=s[i-1]+a[i];
}
int mid=(n+1)/2;
//中位数的位置
nth_element(s+1,s+mid,s+1+n);
/*上文中有提到,所以中间这个加上的值就是表示从0开始,安排好第mid位为中位数,因此不必+1
但是由于我们迭代器使用的是数组的位置,所以前后位置限定还是要+1的*/
int cur=s[mid];
for(int i=1;i<=n;i++)
ans+=abs(s[i]-cur);
printf("%lld\n",ans);
}
return 0;
}

话说环形均分纸牌的题目还真的不少,

这不是四倍经验么2333:

(大家如果觉得掌握的不好可以去AC这几道题,基本上都差不多,就是开long long和不开long long 的区别......,哦对了,输入格式也有一点点不一样,注意改一下)

P4016

P2512

P3156

题解 UVA11300 【Spreading the Wealth】的更多相关文章

  1. Uva11300 Spreading the Wealth

    设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程. 设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱).计算出最后每个人应该有的钱m,解方 ...

  2. UVA11300 Spreading the Wealth 题解

    题目 A Communist regime is trying to redistribute wealth in a village. They have have decided to sit e ...

  3. 【题解】 UVa11300 Spreading the Wealth

    题目大意 圆桌旁边坐着\(n\)个人,每个人有一定数量的金币,金币的总数能被\(n\)整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等.您的任务是求出被转手的金币的数量的最小值. ...

  4. (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币

    bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...

  5. UVA11300 Spreading the Wealth 数学

    前方数学警告 题目链接:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&am ...

  6. UVa 11300 Spreading the Wealth(有钱同使)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...

  7. UVA 11300 Spreading the Wealth (数学推导 中位数)

    Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...

  8. uva 11300 - Spreading the Wealth(数论)

    题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的 ...

  9. Uva 11300 Spreading the Wealth(递推,中位数)

    Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...

  10. Math - Uva 11300 Spreading the Wealth

    Spreading the Wealth Problem's Link ---------------------------------------------------------------- ...

随机推荐

  1. Spring事务管理API

  2. java.lang.NoSuchMethodError: org.springframework.dao.IncorrectResultSizeDataAccessException

    spring data jpa  运用,在dao类中写自己新增的方法,使用@query写hql语句,出现以下异常: Caused by: java.lang.NoSuchMethodError: or ...

  3. ShaderLab内置变量

    [ShaderLab内置变量]

  4. 【BZOJ1013】球形空间产生器sphere

    高斯消元模板题 #include <cstdio> #include <cstring> #include <algorithm> #include <ios ...

  5. file_get_contents无法请求https连接的解决方法 php开启curl

    file_get_contents无法请求https连接的解决方法 方法1: PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fo ...

  6. 通过snmp监控linux

    一.linux snmpd安装 yum install -y net-snmp net-snmp-utils 二.snmp的配置(vim /etc/snmp/snmpd.conf) com2sec n ...

  7. 基于HTML5的RDP访问实战

    基于HTML5的RDP访问实战 1.安装guacamole   2.下载源码   3.安装服务端 安装报错 错误   参考 http://www.remotespark.com/html5.html ...

  8. CloudStack tomcat集成方式分析

    CloudStack 的server.xml和tomcat6.conf都是软连接   CloudStack 在执行脚本时报异常如下:   修改vim /etc/sudoers文件,具体如下     以 ...

  9. 面向对象JS基础

    什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下 ...

  10. Golang 之 Qrcode 二维码

    二维码大行其道,尤其 qrcode ,怎么能少了大golang 呢. follow me . 1.引用 go get github.com/skip2/go-qrcode 2.写 package ma ...