题解 UVA11300 【Spreading the Wealth】
环形均分纸牌问题应该不少人都很熟悉了,而且题解区写的也比较全了......
我这篇题解主要是介绍一个新的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 的区别......,哦对了,输入格式也有一点点不一样,注意改一下)
题解 UVA11300 【Spreading the Wealth】的更多相关文章
- Uva11300 Spreading the Wealth
设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程. 设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱).计算出最后每个人应该有的钱m,解方 ...
- UVA11300 Spreading the Wealth 题解
题目 A Communist regime is trying to redistribute wealth in a village. They have have decided to sit e ...
- 【题解】 UVa11300 Spreading the Wealth
题目大意 圆桌旁边坐着\(n\)个人,每个人有一定数量的金币,金币的总数能被\(n\)整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等.您的任务是求出被转手的金币的数量的最小值. ...
- (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币
bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...
- UVA11300 Spreading the Wealth 数学
前方数学警告 题目链接:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&am ...
- UVa 11300 Spreading the Wealth(有钱同使)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
- UVA 11300 Spreading the Wealth (数学推导 中位数)
Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...
- uva 11300 - Spreading the Wealth(数论)
题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的 ...
- Uva 11300 Spreading the Wealth(递推,中位数)
Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...
- Math - Uva 11300 Spreading the Wealth
Spreading the Wealth Problem's Link ---------------------------------------------------------------- ...
随机推荐
- Oracle 相关知识点结构图
最近在学Oracle数据库,制作了些结构图方便记忆!主要涉及到Oracle数据类型,Oracle的表操作以及Oracle的游标,还有的之后再分享...... Oracle 数据类型 因为图片上只能看到 ...
- 反射与dynamic
反射 var a = Assembly.GetExecutingAssembly(); Type type = a.GetType("CLRTest.ReflectClass"); ...
- cardBattle游戏启动场景设计
- XIb中使用tableview报错UIViewAlertForUnsatisfiableConstraints
1.使用断点工具并不能找出错误,最后仔细看了下报错信息 2.报错信息 [LayoutConstraints] Unable to simultaneously satisfy constraints. ...
- 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计
[抄题]: Given a stream of integers and a window size, calculate the moving average of all integers in ...
- Loadrunner11无法在win7 64位上启用ie解决办法
Loadrunner11无法在win7 64位上启用ie解决办法 1.loadrunner11在win7 64位上默认启用的是32位的那个IE浏览器,路径:C:\Program Files (x86) ...
- jar包打包成exe示例(基于maven项目)
jar包打包成exe示例(基于maven项目) 说明 针对基于maven的Java项目,通常会打包成jar, 如果要把jar文件包装成exe文件,仅需要在pom.xml配置文件中增加一个插件即可 这里 ...
- 02 Transcribing DNA into RNA
Problem An RNA string is a string formed from the alphabet containing 'A', 'C', 'G', and 'U'. Given ...
- [GO]二进制文件的拷贝
writestring的方式只适用于字符串的写入,对于十进制文件的写入只要使用write就可以了 package main import ( "os" "fmt" ...
- jQuary总结5:传递一个dom对象
1 传递一个dom对象 //html <div></div> <p id="p"></p> //js var p = documen ...