通過這一體說說三分的做法。
題目列表 > 集會
時間限制: 2000ms 記憶體限制: 256mb
在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些**往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論之後,大家決定要將集會地點挑選在這樣乙個位置:它離最遠的村莊的距離要盡可能的近。
我們把河看做一條足夠長的直線,河岸就是平面座標系上 y = 0 的這條線,y < 0 的區域是河水,而所有村莊都在 y ≥ 0 的區域裡。現在給出所有村莊的平面座標,你要在河岸上找到這樣乙個位置,使得它到所有村莊的最遠距離最小。
輸入檔案包含多組測試資料。
第一行,給出乙個整數 t,為資料組數。接下來依次給出每組測試資料。
每組資料的第一行是乙個整數 n,表示村莊的數量。接下來 n 行,每行有兩個實數 xi 和 yi,表示每乙個村莊的座標。
對於每組測試資料,輸出一行"case #x: y",其中 x 表示測試資料編號,y 表示集會地點的 x 座標值,要求與正確答案的絕對誤差在10-6以內。所有資料按讀入順序從 1 開始編號。
小資料:t ≤ 100, 0 < n ≤ 50, 0 ≤ |xi|, yi ≤ 10000
大資料:t ≤ 10, 0 < n ≤ 50000, 0 ≤ |xi|, yi ≤ 10000
樣例輸入
1樣例輸出50 8
1 64 4
-5 7
-6 1
case #1: -1.000000題外話:
假設函式f(x) =a*x^2+b*x+c
a = 0,b!=0時退化為一條直線,這個時候滿足單調性,我們可以通過二分來做。
當a!=0時,他為一條拋物線,這個時候我們可以用三分來做。
分析:如上圖。
假設最優點為x,往x的左面走到x1,距離會增大,往x的右面走到x2,距離同樣會增大。
由於只有乙個極值點,我們假設區間為[l,r]。
1.找出兩個點x1,x2(上圖不是很準確。。。),這兩個點剛好把[l,r]分成相等的三個部份。
2.判斷f(x1)與f(x2)哪個更優。
如果f(x1)>f(x2),如左圖,則把l = x1
否則,r = x2
3.重複1,2,直到滿足精度。
由於精度不好控制,我們可以直接設定調整的步數,從題目資料我們可以估計出步數的範圍可以假設為100,(2/3)^100次方肯定能夠滿足精度要求了。。。
程式碼如下:
#include #include #include #include #include #include #include #include #include #include #include using namespace std;大家有空可以做做cf 8d這題,很經典的三分套三分做法。。。typedef long long ll;
typedef unsigned long long ull;
#define lx(x) (x<<1)
#define rx(x) (x<<1|1)
#define debug puts("here")
#define rep(i,n) for(int i=0;iret)
l = m1;
else
r = m2;
}if(px1<0&&fabs(px1)<1e-9) // 判斷是否會出現-0.000000
px1 *= -1.0;
printf("%.6lf\n",px1);
}return 0;
}
以上~~
2013程式設計之美挑戰賽 集會
description 在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些 往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論...
程式設計之美 活動中心問題與三分法
樓主小弱一枚,發現在找工作中演算法還是非常有用的。所以決心現在開始逐步學習。自己初賽都過不去,覺得看下這些題目還是蠻有意思的,總結了網上別人的方法,來寫點自己的理解。題目描述 時間限制 12000ms 單點時限 6000ms 記憶體限制 256mb a市是乙個高度規劃的城市,但是科技高階發達的地方,...
2013程式設計之美資格賽總結
終於可以完成乙個程式比賽的題目了,雖然這次的時間有些長。這是第一次完成,感到真心不錯。廢話不說了,下面說一下這次程式設計之美預選賽的情況。當我在凌晨看到這三個題目時,感覺第乙個還有希望,第二個一點思路沒有,第三個不敢期望。第乙個是詞對變換,感覺不太難。第二道是一種.怎麼說呢,反正是一點思路沒有。第三...