題意:乙個半徑為r的空心圓,內部有乙個n個點的凸多邊形,這個多邊形在圓殼的內部滾動。多邊形頂點按照逆時針順序給出,保證每乙個頂點都有機會接觸圓殼。
起初,1號點,2號點一定在圓上,初始以1號點為軸心、然後依次以2, 3, ..., n號點為軸心「滾動」。具體地講,在以i號點為軸心「滾動」時,多邊形將保持i號點不動,並以該點為中心開始順時針旋轉,直到i+1號點接觸圓為止,然後更換軸心,繼續「滾動」。
求多邊形從初始開始滾動、直到1號點再次到達圓上成為軸心為止,1號點在整個滾動過程中所經過的路程是多少。
題解:畫了很久之後才發現,第i次旋轉的圓心角,可以由第i個點、第i+1個點、第i+2個點的組成的兩條弦算出弦所對的圓心角(用餘弦定理算),然後用圓心角算出弦與圓心組成的等腰三角形的底角(或者直接用餘弦定理算出底角)。然後旋轉角就是這兩個底角的和減去第i+1個點所在的多邊形的角。旋轉半徑不見得一定會是多邊形的邊,而是第1個點和第i+1個點的連線。注意旋轉n-1次後第1個點會和第n個點重新出現在圓上。
const double pi = acos(-1.0);
double x[105], y[105];
double distance(int i, int j)
double angle(int i, int j, int k)
int main()
printf("%.12f\n", sum);
return 0;
}
牛客挑戰賽58
前i 1的二進位制相等,a的前n個數的前i 1位可以亂取,b的前n 1個數前i 1位也可以亂取,因為b的第n個數的前i 1異或可為任意值,所以sum1 2 i 1 n 2 i 1 n 1 2 i 1 2n 1 a的第i位為1且b的第i位為0 只要a的n數第i位中有乙個不為0的,a的第i位不為0,b的...
牛客挑戰賽38 B 子串翻轉
題目鏈結 思路 用乙個大小為m雙端佇列的雙端佇列 維護一下當前視窗的串是啥。翻轉就是把標記變一下。根據標記進行字元的進出。include using namespace std typedef long long ll const int n 3e6 10 define fi first defin...
牛客Wannafly挑戰賽12 題解
傳送門 說是比賽題解,其實我只會前三題 後面的一定補 t1題意,在乙個長度為n的時間內,問如何選擇存款期限,使得收益最大。dp include include include include using namespace std define fi first define se second d...