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

我这篇题解主要是介绍一个新的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. 【原】Coursera—Andrew Ng机器学习—Week 7 习题—支持向量机SVM

    [1] [2] Answer: B. 即 x1=3这条垂直线. [3] Answer: B 因为要尽可能小.对B,右侧红叉,有1/2 * 2  = 1 ≥ 1,左侧圆圈,有1/2 * -2  = -1 ...

  2. jira 安装

    jira jira是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪(bug管理).客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域.同禅道等类似. 安装前准备 ...

  3. maven如何引入servlet-api和jsp-api

    废话不多说,直接上代码 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax. ...

  4. [bzoj2212]Tree Rotations(线段树合并)

    解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...

  5. Flume NG 配置详解

    配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式,是Java属性文件格式.在相同的配置文件,可以指定一个或多个代理的配置.配置文件包括每个源,接收器和通道,把它们连接在一起, ...

  6. 88. Merge Sorted Array (Array)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...

  7. Linux下各种解压命令

    本文介绍了linux下的压缩程式tar.gzip.gunzip.bzip2.bunzip2.compress .uncompress. zip. unzip.rar.unrar等程式,以及如何使用它们 ...

  8. 集合_java集合框架

    转载自http://blog.csdn.net/zsw101259/article/details/7570033 Java集合框架图 简化图: Java平台提供了一个全新的集合框架.“集合框架”主要 ...

  9. [C++] struct memory allocation

    MAX-byte alignment (最大单位对齐) typedef struct user USER; typedef struct employee E; struct user{ ]; //t ...

  10. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...