2013程式設計之美挑戰賽 集會

2021-06-16 20:38:35 字數 1507 閱讀 2622

description

在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些**往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論之後,大家決定要將集會地點挑選在這樣乙個位置:它離最遠的村莊的距離要盡可能的近。

我們把河看做一條足夠長的直線,河岸就是平面座標系上 y = 0 的這條線,y < 0 的區域是河水,而所有村莊都在 y ≥ 0 的區域裡。現在給出所有村莊的平面座標,你要在河岸上找到這樣乙個位置,使得它到所有村莊的最遠距離最小。

input

輸入檔案包含多組測試資料。

第一行,給出乙個整數 t,為資料組數。接下來依次給出每組測試資料。

每組資料的第一行是乙個整數 n,表示村莊的數量。接下來 n 行,每行有兩個實數 x

i 和 y

i,表示每乙個村莊的座標。

小資料:t ≤ 100, 0 < n ≤ 50, 0 ≤ |x

i|, y

i ≤ 10000

大資料:t ≤ 10, 0 < n ≤ 50000, 0 ≤ |x

i|, y

i ≤ 10000

output

對於每組測試資料,輸出一行"case #x: y",其中 x 表示測試資料編號,y 表示集會地點的 x 座標值,要求與正確答案的絕對誤差在10

-6以內。所有資料按讀入順序從 1 開始編號。

sample input

1

50 8

1 64 4

-5 7

-6 1

sample output

case #1: -1.000000
這題在眾大神的點撥下使用三分查詢法,不過函式的凸性是需要理論證明的,這是神奇的乙個地方。
#include #include #include #include #include #include using namespace std;

const double eps=1e-6;

const int nmax=51000;

double x[nmax],y[nmax];

int n;

double caldis(double m)

int main()

{ int t,cas=1;

cin>>t;

while(t--) {

cin>>n;

for(int i=1;i<=n;i++)

cin>>x[i]>>y[i];

double l=-10000,r=10000,mid,midmid;

while(r-l>=eps)

{ mid=l+(r-l)/2.0;

midmid=mid+(r-mid)/2.0;

double m1=caldis(mid);

double m2=caldis(midmid);

if(m1

2013程式設計之美全國挑戰賽

description alice和bob都要向同乙個商人購買鑽石。商人手中有 n 顆鑽石,他會將它們一顆顆地賣給他們,alice和bob通過競價的方式來決定鑽石的歸屬。具體的過程如下 商人首先指定其中乙個人開始 之後兩人輪流 要求是一定要比對方報的 更高。任何時候,如果乙個人不願出價或者出不起價錢...

2013程式設計之美全國挑戰賽

description 對於兩個長度相等的字串,我們定義其距離為對應位置不同的字元數量,同時我們認為距離越近的字串越相似。例如,0123 和 0000 的距離為 3,0123 和 0213 的距離則為 2,所以與 0000 相比,0213 和 0123 最相似。現在給定兩個字串 s1 和 s2,其中...

程式設計之美2013全國挑戰賽測試賽

題目列表 a b 時間限制 1000ms 記憶體限制 1024mb 輸入兩個正整數a和b,求a b的值 兩個正整數a,b a b的和 對於小資料,0 a,b 10 對於大資料,0 a,b 10 100樣例輸入 2 3 樣例輸出 5 如下 1 include 2 include 3 include 4...