LA3708墓地雕塑
生活随笔
收集整理的這篇文章主要介紹了
LA3708墓地雕塑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 有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<stdio.h>
double abss(double x)
{
? ?return ?x > 0 ? x : -x;
}
int main ()
{
? ? int n ,m;
? ? double Ans;
? ? while(~scanf("%d %d" ,&n ,&m))
? ? {
? ? ? ? Ans = 0;
? ? ? ? for(int i = 1 ;i < n ;i ++)
? ? ? ? {
? ? ? ? ? ?double pos = i * 1.0 / n * (n + m);
? ? ? ? ? ?double now = abss(pos - int(pos + 0.5)) / (n + m);
? ? ? ? ? ?Ans += now;
? ? ? ? }
? ? ? ? printf("%.4lf\n" ,Ans * 10000);
? ? }
? ? return 0;
}
? ? ? 有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<stdio.h>
double abss(double x)
{
? ?return ?x > 0 ? x : -x;
}
int main ()
{
? ? int n ,m;
? ? double Ans;
? ? while(~scanf("%d %d" ,&n ,&m))
? ? {
? ? ? ? Ans = 0;
? ? ? ? for(int i = 1 ;i < n ;i ++)
? ? ? ? {
? ? ? ? ? ?double pos = i * 1.0 / n * (n + m);
? ? ? ? ? ?double now = abss(pos - int(pos + 0.5)) / (n + m);
? ? ? ? ? ?Ans += now;
? ? ? ? }
? ? ? ? printf("%.4lf\n" ,Ans * 10000);
? ? }
? ? return 0;
}
總結
以上是生活随笔為你收集整理的LA3708墓地雕塑的全部內容,希望文章能夠幫你解決所遇到的問題。