LA3708墓地雕塑

2022-09-05 01:21:11 字數 1028 閱讀 5325

題意:

有n個墓碑,等距離的分布在乙個圓形墓地的周圍,然後又要新增m個墓碑,最後要求所有的墓碑還是等距離,新增的墓碑可以放在任意位置,問之前的n個墓碑的最少移動距離之和是多少?

思路:現在我們猜想,如果之前的n個墓碑至少有乙個是不動的,那麼來了m個墓碑之後的所有墓碑的位置都已經固定了,現在就是看要把之前的n個墓碑都放在哪個位置,現在有乙個結論就是說每個墓碑放在離他最近的位置,這樣就ok了,這麼敲有兩個東西要證明

(1) 為什麼至少有乙個墓碑是沒有移動的(這個我還沒想好,書上說是之前的例3的中位數,那個我理解了,不過這個我沒想好怎麼和他們聯絡上,以後再補充.)

(2) 每個墓碑移動到最近的位置是不是會有兩個墓碑最後移動到同乙個位置的時候?

這個我來證明下:

方法1 給的n,m都是<= 1000的,我們直接跑一邊驗證一下就行了。

方法2 是直接證明,首先對於每個墓碑去它最近的位置可以這樣算

比如第i個墓碑那麼我們現在先在單位原上操作,最後*10000就行了

pos = double(i) / n * (n + m) ://這個其實是把圓放大後i原來的實際位置

tmp = abs(pos - int(pos+0.5))/(n + m):// int(pos+0.5)是放大後i的實際位置 

如果有兩個點的最近點在同乙個點上那麼就會有int(pos1+0.5) = int(pos2+0.5) 

也就是兩個數的四捨五入值相等,那麼這兩個數的最大差是1.49999..-0.5雖然很接      近1,但是永遠都不可能是1,而放大的圓的每兩個點之間的距離都是1,隨意矛盾了

最後解釋下上面說的那個放大 就是之前是把乙個單位圓分成n分,現在是把乙個周長為(n+m)的圓分成(n+m)分,每份是1,放大後離自己最近的點就是離自己最近的整數點也就是四捨五入後的點。 

#include

double abss(double x)

int main ()

printf("%.4lf\n" ,ans * 10000);

}return 0;

}

墓地雕塑 LA 3708

思路 現在我們猜想,如果之前的n個墓碑至少有乙個是不動的,那麼來了m個墓碑之後的所有墓碑的位置都已經固定了,現在就是看要把之前的n個墓碑都放在哪個位置,現在有乙個結論就是說每個墓碑放在離他最近的位置,這樣就ok了,這麼敲有兩個東西要證明 1 為什麼至少有乙個墓碑是沒有移動的 這個我還沒想好,書上說是...

uvalive 3708 墓地雕塑

加入新的雕塑之後,很明顯,坑的位置很固定,假設圈長為一的話每個坑都距離1 n m 所以呢原有的雕塑距離為1 n 這時候只需要保持乙個位置不變,其餘的都就近靠就可以了,這樣一定是距離最近的演算法 include include include include using namespace std i...

Graveyard 墓地雕塑

在乙個周長為10000 的圓上等距分布著n 個雕塑。現在又有m 個新雕塑加入 位置可 以隨意放 希望所有n m 個雕塑在圓周上均勻分布。這就需要移動其中一些原有的雕塑。要求n 個雕塑移動的總距離盡量小。輸入格式 輸入包含若干組資料。每組資料僅一行,包含兩個整數n 和m 2 n 1 000,1 m 1...