uva11300 - Spreading the Wealth(分金币)

2023-11-20 19:39

本文主要是介绍uva11300 - Spreading the Wealth(分金币),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代数分析::::

先算出平均数ave然后我们开始分析,,,,

每个人都只有给出和给进两部分,如果用数字表示则是一负一正

1号座位的人只与4号和2号有联系,则有x1表示1给4的,同理x2表示2给1的。

如果x1<0则表示4给1了-x1个金币。。

1: A1-x1+x2=ave -> x2 = ave-A1+x1 = x1-C1(C为常数)

2: A2-x2+x3=ave -> x3 = ave-A2+x2 = ave-A2+x1-C1=x1-C2

3: A3-x3+x4=ave -> x4 = ave-A3+x3 = ave-A3+x1-C2=x1-C3

.....

n: An-xn+x1=ave -> xn = ave-An+x1 = ave-An+x(n-1)=x1-Cn

我们的目的要求|x1|+|x1-C1|+|x1-C2|+...|xn-Cn|的最小值,

我们可以把上式看作要求点x1使得x1到0,C1,C2....Cn的距离最短。

然后求出最小值就行了。这就是代数分析。

很实用的能把题目难度降低的思路之一。。。。

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
#define M 1000010
long long a[M], c[M];
int main ()
{long long n, sum, ave;while(scanf("%lld",&n)==1){sum = 0;for(int i = 1; i <= n; i++) {scanf("%lld",&a[i]); sum+=a[i];}ave = sum/n; c[0] = 1;for(int i = 1; i <= n; i++) c[i] = c[i-1]+a[i]-ave;sort(c,c+n);long long x1 = c[n/2], ans = 0;for(int i = 0; i < n; i++) ans+=abs(x1-c[i]);printf("%lld\n",ans);}return 0;
}


这篇关于uva11300 - Spreading the Wealth(分金币)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396956

相关文章

安卓金币字符串转换成三位一个逗号的格式

DecimalFormat df1 = new DecimalFormat("###,###,###,##0.##");         return df1.format(Double.parseDouble(“ 17352208.25 ”)); 输出   17,352,208,25

Math - Uva 11300 Spreading the Wealth

Spreading the Wealth  Problem's Link  ---------------------------------------------------------------------------- Mean:  n个人围成一圈,每个人手里有Ai个金币,每个人可以给与他相邻的人一些金币,通过一系列的流转后,最后所有人的金币数相等。问整个过程最少需

实现用python刷王者荣耀金币

刷冒险最后一关,需要满符文 需要安装adb,可以网上查阅怎么安装 将adb路径加入环境变量 # -*- coding: utf-8 -*-"""Created on Wed Feb 20 13:48:11 2019微信区:东皇,鲁班,扁鹊QQ区:赵云,鲁班,扁鹊@author: 邓磊"""from subprocess import runimport timepath="D:\

1.5编程基础之循环控制45:金币

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里,每天收到三枚金币;之后四天(第七、八、九、十天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币(N为任意正整数)。 你需要编写一个程序,确定从第一天开始的给定天数

金币阵列

问题描述:有m*n枚金币在桌面上排列成一个m行n列的金币阵列。每一枚金币或正面朝上,或背面朝上。用数字表示金币状态,0表示正面朝上,1表示背面朝上。 金币阵列游戏的规则是:     (1)每次将任一行金币翻过来放在原来的位置上。     (2)每次可以任选2列,交换这2列金币的位置。     任务:给定金币的初始状态和目标状态,编程计算按金币游戏规则,将金币排列从初始状态变换到目

可控的金币随机掉落算法

需求是这样的,我们设计好了一个副本,里面怪物和怪的数量已经确定了,就100只吧,现在我们想让怪物随机得掉落金币,但是一个副本掉落金币的总量需要精确控制到10000金。那么算法应该怎么写?突然觉得很像微信抢红包的算法。 要实现起来,方法很多,这里记录一个我觉得最简单有效的办法。 const int c_min_package = 20;int DropsManager::dropsC

uva 11300 - Spreading the Wealth(数论)

题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的金币数量相等,问说最少移动的金币数额。 解题思路:假设xi为第i个人给左手边人的金币数量,那么就有a[i] - x[i]+ x[i + 1] = aver.那么 a[1] - x[1

leetcode 2944.购买水果需要的最小金币

思路:dp 这道题一开始想的时候并不会,但是看到了有些水果可以买也可以不买,所以就想到了选择与不选择的思路。 对于每一个水果,我们都有买和不买的选择,但是我们的第一个水果是一定要买的。然后再往后推导。 用dp[][2]来表示这个状态方程。dp[i][1]表示的就是选择买第i个水果,另外一个状态就是不买了。 但是大家也发现了,不买水果的话,我们还需要知道的一点就是前面是否有买过水果能让当前这

用Python代码刷王者金币

原理 王者荣耀的冒险模式里有个挑战模式,第一次过关可以获得比较多的金币,后面重新挑战还是会获得少量金币,这不算是bug,只有你不嫌烦手动蛮力也可以刷金币。 推荐关卡:陨落的废都 - 魔女回忆 此关卡使用纯输出英雄20秒左右可以打BOSS,50秒左右可以通关,每次重复通关可以获得奖励19金币。在开挂前建议你手动通关体验一下。此为游戏原理。 简单来说,需要执行以下步骤: 界面打开至挑

金铲铲无限金币-罗小黑最新

罗小黑最新,下载自测。 记得查看注意事项。 获取链接:https://pan.baidu.com/s/1mRuQPAqWXv6oeihQ5fsn0w?pwd=d0s3  提取码:d0s3  --来自百度网盘超级会员V1的分享