uva1388 Graveyard

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;
}
發佈了43 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章