分別輸入起始點a,經過的點b,和結束點c的圓弧,問點p的位置到這段圓弧的最短距離是多少。
測試資料
樣例輸入: 樣例輸出:
0 0 1 1 2 0 1 -1 case 1: 1.414
3 4 0 5 -3 4 0 1 case 2: 4.000
解法:先用3個方程求出圓的方程求出圓心(x0,y0)以及圓的半徑sqrt(r)。然後不知是三分還是二分。從兩端點位置開始列舉尋找。更新圓弧兩端點中心位置mid,如果左邊端點到p點距離近就使右邊端點更新為mid,反之亦然。找中心位置mid的時候,用相似三角形和點繞點旋轉90度的方法找到mid點。特殊情況需要判斷點在兩端點構成線段的左右位置。
#include #include #include #include #include #include #include #include #include #include #include #include #define ll __int64
#define eps 1e-8
using namespace std;
double x0,x1,x2,x3,px,py,y0,y1,y2,y3,r;
int flag;
struct point
};int dcmp(double x)
point go(point v,point l,point r)
else
else
}printf("case %d: %lf\n",cas++,ans);
} return 0;
}
我們其實不需要用精度計算。只需要判斷p點到圓心是否在圓的起始點經過中點到終點的角度,如果在角度範圍內則最下距離為圓心距離到p點距離減去半徑的絕對值,不在則為起始點或終點到p點兩者的最小距離。
ac**:
#include #include #include #include #include #include #include #include #include #include #include #include #define ll __int64
#define eps 1e-8
using namespace std;
double x0,x1,x2,x3,px,py,y0,y1,y2,y3,r;
int flag;
struct point
};int dcmp(double x)
point go(point v,point l,point r)
else
else
}else
else
}printf("case %d: %.3lf\n",cas++,ans);
} return 0;
}
湖南省2010程式設計大賽第一題
超級水題。不解釋!題目 題目a 汽水瓶有這樣一道智力題 某商店規定 三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?答案是5瓶,方法如下 先用9個空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借給你一...
第十屆浪潮杯山東省ACM程式設計競賽總結
5.11 5.12 濟南大學,蒟蒻的一場acm表演 開幕式上有石教授的精彩發言,中國石油大學張學輝教練的一句話至今猶言在耳 近十年來,許多學生通過acm圓了清北夢。我的感覺 acm是乙個讓人拿得起卻又放不下的東西,曾經為acm而痛苦,可是想到背後的林林總總,卻從沒有輕言放棄。濟南大學八食堂的飯菜好評...
山東省第十屆浪潮杯L題
題目大意 有n個數 然後是m排,每排都是給了乙個大小關係 前面乙個大於後面乙個 然後找中位數 可以用floyd 跑 找出之間的關係 然後看前後的數是不是n 2就 ok了。include include includeusing namespace std int mp 105 105 int vis...