首页 > 其他分享 >UVa 11300 Spreading the Wealth 题解

UVa 11300 Spreading the Wealth 题解

时间:2022-10-11 17:25:25浏览次数:83  
标签:题解 ll 我们 金币 cdots 11300 UVa include sum

非常好的一道数学题。

原题链接(洛谷)

原题链接(UVa)

题目分析

(参考刘汝佳《算法竞赛入门经典 \(\cdot\) 训练指南》)

本身看起来很复杂。不要急,我们慢慢分析。

首先,每个人最终的金币数是可以计算出来的,即总金币数去除以总人数,我们设这个数等于\(M\)。

假设一共有 \(n\) 个人,编号为 \(1\),\(2\),\(3\),\(4\),\(\cdots\)。设每个人刚开始拥有的金币数为 \(A_i\),\(x_i\) 表示第 \(i\) 个人给其上一个人的金币数(\(x_1\) 表示给 \(n\) 的金币数)。那么对于编号 \(1\),经转手后的金币数就等于 \(M=A_1-x_1+x_2\),同理:\(M=A_2-x_2+x_3,M=A_3-x_3+x_4\cdots\)。最终我们就可以获得第 \(n\) 个式子 \(M=A_n-x_n+x_1\),那我们是不是就可以解方程组了呢?很遗憾,最后一个方程是可以通过前 \(n-1\) 个方程推导出来的,故只有前 \(n-1\) 个方程是有用的。

尽管无法直接求解,我们还是可以用 \(x_1\) 表示其他的 \(x_i\),进而转化为单变量的极值问题。

对于第 \(1\) 个人,可以得到 \(x_2=x_1+M-A_1\)。

对于第 \(2\) 个人,可以得到 \(x_3=x_2+M-A_2=x_1+M-A_2+M-A_1\)。

对于第 \(3\) 个人,可以得到 \(x_4=x_3+M-A_3=x_1+M-A_3+M-A_2+M-A_1\)。

\(\cdots\)

所以对于第 \(n\) 个人,有 \(x_n=x_1+nM-(\sum_{i=1}^nA_i)\)。

最后,我们要求解的是转手金币数的最小值,也就是 \(\min\{\sum_{i=1}^n|x_i|\}\),所以这个时候我们令 \(C_i=(\sum_{i=1}^nA_i)-i\cdot M\),这样,我们要求解的式子就变成 \(\min\{|x_1|+|x_1-C_1|+|x_2-C_2|+\cdots +|x_n-C_n|\}\)。由于两个值的差的绝对值的几何意义是二者的距离,所以我们把求最小值这个问题放在数轴上来解决,问题也转成求 \(x_1\) 到各个 \(C_i\) 的距离之和的最小值。

图解

假设我们的红圈(\(x_1\))向右微微移动了 \(d\) 个单位,那么对于左边就增加了 \(2d\) 的距离,对于右边减少了 \(4d\) 的距离,故减少了 \(2d\) 的距离。所以每次只要我们向蓝圈更多的一边去移动,就会对答案产生贡献,进而推出当红圈两边的蓝圈数相等,即处于中位数时,可以获得最小值。之后我们将 \(C_i\) 从小到大来排序,然后统计答案即可。

对于 \(A_i\),我们没有任何必要保存,具体实现请看代码:

点击查看代码
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll M,sum;
int n;
ll C[1000005];

inline ll re(){
	register ll k=0,f=1ll;
	register char c=getchar();
	while(!isdigit(c)){
		if(c=='-') f=-1ll;
		c=getchar();
	}
	while(isdigit(c)){
		k=k*10ll+(c^48ll);
		c=getchar();
	}
	return 1ll*k*f;
}

void wr(ll x){
	if(x<0){
		x=~x+1;
		putchar('-');
	}
	if(x>9) wr(x/10ll);
	putchar(x%10ll^48ll);
}

signed main(){
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;++i) C[i]=0;
		for(int i=1;i<=n;++i){
			ll x=re();
			C[i]=x+C[i-1];
		}
		M=C[n]/n;
		for(int i=1;i<=n;++i) C[i]-=i*M;
		sort(C+1,C+1+n);
		ll x=C[(n+1)/2],ans=0;
		for(int i=1;i<=n;++i)
			ans+=abs(x-C[i]);
		wr(ans);
		putchar('\n');
	}
	return 0;
}

标签:题解,ll,我们,金币,cdots,11300,UVa,include,sum
From: https://www.cnblogs.com/WXDreemurr/p/16779872.html

相关文章

  • uva127 -
    Timelimit:3.000seconds限时:3.000秒 Problem问题Youaretosimulatetheplayingofgamesof"Accordian"patience,therulesforwhichareasfollows:模拟玩......
  • CF1237F 题解
    传送门题意给你一个\(n\timesm\)的棋盘,上面已经放了\(k\)个\(1\times2\)的骨牌。对于一个骨牌的每个格子,不能有其他骨牌的格子与它在同一行、同一列。你可以......
  • 在实际开发中遇到的各种问题解决方案
    目录第一问:使用axios异步请求完成数据导出(Excel)(基于hutool工具包)(1.1)编写后台接口,获取到response对象以及前端传来的数据,使用@RequestBody获取到需要进行导出的数据id(1.1.1)......
  • [BalticOI 2010] Mines 题解
    你谷linklojlink提供一种时间复杂度正确的高妙做法。首先题目有一条隐藏条件是保证\(n\not\equiv2\pmod3\)或\(m\not\equiv2\pmod3\),需要通过观察数据得到。我们......
  • 2022 ICPC 网络赛(II) H Fast Fourier Transform题解
    简要题意给你一棵树,你可以选若干节点为关键点,定义一个选点方案的价值为:所有路径上没有关键点的点对的距离之和。求所有选点方案的价值之和。题解一开始和队友都读错题了......
  • SCOI 萌萌哒 题解
    下决心写一道题写一篇题解。题目链接考虑暴力,直接并查集合并相同的数,和今天T1一样。考虑优化这个暴力。因为今天T1题解说要倍增,所以考虑一个长的跟ST表一样的倍增。具......
  • 洛谷 P3488 [POI2009]LYZ-Ice Skates 题解
    错解每次跑二分图匹配,时间复杂度显然爆炸。时间复杂度:我被杀手皇后摸过了正解引入Hall定理:设二分图中\(G=<V_1,V_2,E>,|V_1|\le|V_2|\),则G中存在\(V_1\)到......
  • 【题解】XXI Opencup GP of Tokyo Count Min Ratio
    有\(R\)个红球,\(B\)个蓝球和一个绿球,同色球之间无区别。将其任意排列,令\(l_R,l_B,r_R,r_B\)分别为绿球左/右边的红/蓝球数量。定义一个方案的权值为\(\max\{x\i......
  • Criss Cross OJ【R001】8月月赛I题解合集
    R0011.「T1」积木高塔Solution返回题目简要题意:给定一个矩阵,以及其每一格中完全相同立方体的高度(即个数),求:这座高塔最高点的高度。这座高塔从第\(1\)层到最高......
  • AtCoder Regular Contest 150 (ARC150) - A+B+C+D 题解
    A题意给定一个由0,1和?组成的长为\(n\)序列,其中?需要被替换为0或1,询问是否有且仅有一种?的替换方案使得序列中有\(k\)个1并且这\(k\)个1是连续的序......