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

我这篇题解主要是介绍一个新的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. Oracle 相关知识点结构图

    最近在学Oracle数据库,制作了些结构图方便记忆!主要涉及到Oracle数据类型,Oracle的表操作以及Oracle的游标,还有的之后再分享...... Oracle 数据类型 因为图片上只能看到 ...

  2. 反射与dynamic

    反射 var a = Assembly.GetExecutingAssembly(); Type type = a.GetType("CLRTest.ReflectClass"); ...

  3. cardBattle游戏启动场景设计

  4. XIb中使用tableview报错UIViewAlertForUnsatisfiableConstraints

    1.使用断点工具并不能找出错误,最后仔细看了下报错信息 2.报错信息 [LayoutConstraints] Unable to simultaneously satisfy constraints. ...

  5. 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计

    [抄题]: Given a stream of integers and a window size, calculate the moving average of all integers in ...

  6. Loadrunner11无法在win7 64位上启用ie解决办法

    Loadrunner11无法在win7 64位上启用ie解决办法 1.loadrunner11在win7 64位上默认启用的是32位的那个IE浏览器,路径:C:\Program Files (x86) ...

  7. jar包打包成exe示例(基于maven项目)

    jar包打包成exe示例(基于maven项目) 说明 针对基于maven的Java项目,通常会打包成jar, 如果要把jar文件包装成exe文件,仅需要在pom.xml配置文件中增加一个插件即可 这里 ...

  8. 02 Transcribing DNA into RNA

    Problem An RNA string is a string formed from the alphabet containing 'A', 'C', 'G', and 'U'. Given ...

  9. [GO]二进制文件的拷贝

    writestring的方式只适用于字符串的写入,对于十进制文件的写入只要使用write就可以了 package main import ( "os" "fmt" ...

  10. jQuary总结5:传递一个dom对象

    1 传递一个dom对象 //html <div></div> <p id="p"></p> //js var p = documen ...