1、證明最優情況下,必定有一個雕塑沒有移動。
考慮有一個雕塑沒有移動的情況:
紅色的圓點代表n個之前就存在的雕塑,紫色的代表添加m個之後所有的雕塑的位置。
由於整個圖形是圓形,所以具有很強的對稱性質:離2號和4號最近的點是對稱的、離1號和5號最近的點是對稱的。
現在將3號向右移動一點距離x,則3號左右的點的情況是完全相反的----若2號離他最近的點的距離增大,則4號就要減小;若1號離他最近的點的距離減小,則5號則要增大。
所以相當於所有的點距離和增大;
上面說的情況是數量n爲奇數的時候,若是n爲偶數,剩下最後一個不配對的點,他到離他最近的點的距離有可能增大(所有點距離和增大),有可能減小(所有點距離和不變)。
所以,綜上所述,向某一個方向移動只會導致距離和的增加或者不變,肯定不會減少。
現在,假設所有點距離和最小的情況時,並沒有任何一個雕塑在原來的位置。
則取距離自己最近的一個點距離最小的雕塑,移動到該點上去,過程同上面討論的過程相反,所以最終結果只會導致距離和的減少或者不變。
移動"距離自己最近的一個點距離最小的雕塑"的原因是,由於移動的距離是所有距離的最小值,所以不會出現某一些點“穿過”雕塑的情況,只有兩種情況:1、單純的增加或者減少2、先增加或減少再減少或增加,不論怎樣點對都是對稱的~
2、計算
假設之前每個雕塑之間的距離爲N,添加m個點之後,間距爲M。
對於第k個雕塑(取沒有移動的雕塑爲參考點):距離他最近的一個點的距離爲:
1、x,當x<M/2時;
2、M/2-x,當想>=M/2時;
其中x爲k*N%M (這裏使用%不太恰當,因爲N,M不爲整數)
我們完全可以寫一個if \else 就完事了。
當然如果非要用函數的話,可以表示成:M/2 - |x - M/2| ;
這個是根據下面的函數圖構造的一個函數:
/*
* test.cpp*
* Created on: 2013-8-29
* Author: zhijian
*/
#include <stdio.h>
#define L 10000.0
int n,m;
double Fab(double a){
return a>0?a:-a;
}
void F(){
double sum = 0;
double dertan = L/n,dertam = L/(m+n);
double c = 0;
for(int i = 1;i<n;i++){
c += dertan;
while(c>dertam) c-= dertam;
sum += dertam/2 - Fab(c-dertam/2);
}
printf("%.4lf\n",sum);
}
int main(){
while(scanf("%d %d",&n,&m)==2){
F();
}
return 0;
}