1,題意:y軸左右兩個點集,求它們中點的最遠距離.
2,解決:
最遠距離的兩個點必定在所有點的凸包上,點到點的最遠距離對應點相關的凸包邊到點的最遠距離.
先求出凸包點,在依次求出每條凸包邊對應的最遠點,得到乙個ans,遍歷所有的邊即可得到結果.
3,實現**:
#include
#include
using namespace std;
/*pointset:輸入的點集
ch:輸出的凸包上的點集,按照逆時針方向排列
n:pointset中的點的數目
len:輸出的凸包上的點的個數
*/struct point
;//小於0,說明向量p0p1的極角大於p0p2的極角
double multiply(point p1,point p2,point p0)
double dis(point p1,point p2)
void graham_scan(point pointset,point ch,int n,int &len)
len=top+1;
}#define min(x,y) (x < y ? x : y)
#define max(x,y) (x > y ? x : y)
//返回值點q到線段p1p2的距離
double pointtoline(point p1,point p2,point q)
if (p1.y==p2.y)
if (flag)
if (min(p1.x,p2.x)<=s.x&&s.x<=max(p1.x,p2.x))
return sqrt((q.x-s.x)*(q.x-s.x)+(q.y-s.y)*(q.y-s.y));
else
return min(sqrt((q.x-p1.x)*(q.x-p1.x)+(q.y-p1.y)*(q.y-p1.y)),sqrt((q.x-p2.x)*(q.x-p2.x)+(q.y-p2.y)*(q.y-p2.y)));
}const int maxn=200000;
point pointset[maxn];
point ch[maxn];
int n;//記錄點的個數
int len;//記錄凸包的點數
double ans;//結果
//求出兩兩點之間的最遠距離
void check(point p1,point p2)
}int main()
j=(j+1)%len;
check(ch[i],ch[j]);
check(ch[i+1],ch[j]);
check(ch[i],ch[j+1]);
check(ch[i+1],ch[j+1]);
}cout<}return 0;
}
國際大學生程式設計競賽例題 1 2 求和
題目大意 不計進製的加法,進製範圍 2到16 例如 55 67 十進位制 55 add 67 12 二進位制 110111 add 1001100 1111011 123 輸入 2 10 兩個區域,十進位制加 3 69 15 輸出 從3到6 加上 從9到15的和 解答 include using n...
國際大學生程式設計競賽例題 1 4 旅館
1,題意 字串匹配 乙個待匹配字串m 0或多個任意字元,1個任意字元 乙個驗證字串t 長度不超過50 輸出 符合條件的個數 2,思路 動態規劃 d i j 表示m的前i個字元和t的前j個字元匹配的結果.轉移方程 d i j d i 1 j 1 t j d i j d i j 1 d i 1 j t ...
國際大學生程式設計競賽例題 4,6樹
1,題意 n個節點,每個節點都有編號.k k 2 個葉子,可以組成多少這樣的樹.輔助方法 prufer code,選出標號最小的葉子點,刪除,輸出它的父親節點編號,直到剩餘兩個節點.得到乙個n 2的序列,就是prufer碼,可以證明其和樹是一一對應的.問題轉化為先從n個節點擊k個作為葉子,剩餘的n ...