日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UVA11300分金币

發(fā)布時(shí)間:2025/6/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA11300分金币 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 圓桌旁作者n個(gè)人,每個(gè)人都有一定數(shù)量的金幣,他們每次可以給相鄰的人一枚金幣(可以給多次),問(wèn)所有人金幣數(shù)都相同的話最少要給多少次金幣。


思路:?
? ? ? 這個(gè)題目感覺(jué)很好,首先我們可以假設(shè)每個(gè)人都向他前面的人給出了xi的金幣,x1表示1這個(gè)人給了n這個(gè)人(因?yàn)槭黔h(huán))多少金幣,x2表示2給了以多少金幣,xi可以使負(fù)數(shù),負(fù)數(shù)說(shuō)明是反著給的x2=-4說(shuō)明是一給了二4枚金幣,這樣我們就可以列出來(lái)一些方程組了
,假設(shè)M是平均數(shù),Ai表示第i個(gè)人的金幣數(shù),那么有


A1-x1+x2=M ?-> ? ? ? ? ? ? ? x2=x1-(A1-M)= x1-C1 ? 設(shè)C1=A1-M
A2-x2+x3=M ?->x3 = x2-(A2-M)=x1-C1-(A2-M)= x1-C2 ? 設(shè)C2=(A1-M)+(A2-M)
同理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x3= x1-C3 ? 設(shè)C3= (A1-M)+(A2-M)+(A3-M)
我們用含有A1的式子推出x2,用含有A2的退出x3...所以我們沒(méi)有必要用最后一個(gè)式子,還有一點(diǎn)就是 x1 = x1 - C0 那么C0=0;
這樣推到之后就變成我們是要求 |x1| + |x1-C1| + |x2-C2|......
那么把他們和一維坐標(biāo)聯(lián)系起來(lái),是不是就是求所有點(diǎn)到x1點(diǎn)(Ci構(gòu)成的點(diǎn))的距離和的最小值了,這樣我們只要求出x1就行了,其實(shí)這個(gè)x1就是所有C的中位數(shù),為什么是這樣這個(gè)很好理解,我們可以在紙上畫(huà)一畫(huà),比如當(dāng)前的x1左邊有4個(gè)點(diǎn),右邊有5個(gè)點(diǎn),那么把x1向右移動(dòng)一小塊距離d(不要跨過(guò)右邊的點(diǎn))我們會(huì)發(fā)現(xiàn)整體是左邊增加4d,右邊減少5d所以我們要往左移,不能往右移,最后奇數(shù)的情況就是中間的那個(gè)數(shù)最優(yōu)(中位數(shù)),偶數(shù)的時(shí)候是中間的那兩個(gè)之間的位置(包括中間的那兩個(gè))的區(qū)間都是最優(yōu)的,還可以用中位數(shù)表示。



#include<stdio.h>
#include<algorithm>


#define N 1000000 + 10


using namespace std;


long long num[N];
long long C[N];


long long abss(long long x)
{
? ?return x > 0 ? x : -x;
}?


int main ()
{
? ?int n ,i;
? ?long long Ans ,Sum ,M;
? ?while(~scanf("%d" ,&n))
? ?{
? ? ? for(Sum = 0 ,i = 1 ;i <= n ;i ++)
? ? ? {
? ? ? ? ?scanf("%lld" ,&num[i]);
? ? ? ? ?Sum += num[i];
? ? ? }
? ? ? M = Sum / n;
? ? ? C[0] = 0;
? ? ? for(i = 1 ;i < n ;i ++)
? ? ? C[i] = C[i-1] + num[i] - M;
? ? ? sort(C ,C + n);
? ? ? long long x1 = C[n/2];
? ? ? for(Ans = 0 ,i = 0 ;i < n ;i ++)
? ? ? Ans += abss(x1 - C[i]);
? ? ? printf("%lld\n" ,Ans);
? ?}
? ?return 0;
}
? ? ??
? ? ??
? ? ??
? ? ??
? ? ??
? ? ??
? ? ??
? ?
?





總結(jié)

以上是生活随笔為你收集整理的UVA11300分金币的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。