采礦 Problem Description 某天gameboy玩魔獸RPG。有一個任務是在一個富含金礦的圓形小島上建一個基地,以最快的速度采集完這個小島上的所有金礦。這個小島上有n(0<n<1000000)個金礦,每個金礦的礦藏量是相等的。而且這個小島的地勢非常平坦,所以基地可以建在小島的任何位置,每個金礦的采礦速度只跟礦藏到基地的路程長度有關。為了不讓這個任務太無聊,游戲設計者對這個小島施了個“魔法”,規定礦工在小島上只能正南正北正西正東走。也就是說礦工不能斜著在島上走。 這個小島在一個二維直角坐標系中描述。 你的任務就是幫gameboy找一個建造基地的位置,使礦工能以最快的速度采完所有礦。 Input 輸入數據有多組。每組數據的第一行是一個正整數n(0<n<1000000),表示小島上有n個金礦。在接下來的n行中,每行有兩個實數x,y,表示其中一個金礦的坐標。n=0表示輸入數據結束。 Output 每一組輸入數據對應一行輸出,輸出兩個實數x,y(保留小數點後兩位),也就是你找到的建造基地的位置坐標。如果坐標不唯一,可以任選一個輸出。 Sample Input 4 1.0 1.0 3.0 1.0 3.0 3.0 1.0 3.0 0 Sample Output 2.00 2.00 Source lwg 這道題還好吧!不太難!發代碼! [cpp] //在這裡提示一下思路吧! //假設所有的礦點都建在一條線上,那麼我們很容易知道,如果將坐標值最大的礦點和最小的礦點連在一起 //那麼,這條線上的每一個點到所有礦點距離之和都最小 //這道題目只是兩條線而已,是上面的一個推廣!下面的求中間的值是一種方法,顯然,這道題目不止一種解法 //如果我們將xy軸上的最大值最小值都連起來,形成一個矩形,那麼矩形裡面所有的值都滿足題意! #include<iostream> #include<algorithm> using namespace std; #define MAX 1000010 double arrx[MAX],arry[MAX]; bool cmp(double a,double b) { return a<b; } int main() { int i,j,num; //memset(arrx,0,sizeof(arrx)); //memset(arry,0,sizeof(arry)); while(cin>>num && num!=0) { for(i=0;i<num;i++) scanf("%lf%lf",&arrx[i],&arry[i]); sort(arrx,arrx+num,cmp); sort(arry,arry+num,cmp); printf("%.2f %.2f\n",arrx[(num-1)/2],arry[(num-1)/2]); } // system("pause"); return 0; }