hdu4679 Convex Hull 計算幾何

2021-06-25 12:34:27 字數 1727 閱讀 4389

50個點,每個點有乙個恆定速度,給定乙個時刻t

求找到所有特殊的時間點: 只有在存在三點共線的時候凸包上的點才會改變。

如果凸包上的點保持不變,其面積隨時間變化是乙個一元二次函式(考慮相鄰兩點的位置向量是乙個關於時間的一次函式,叉乘後得到乙個一元二次的式子)。

所以求出a,b,c後求積分即可。求a,b,c時可以取開始時間點,結束時間點,再取乙個中間點。這個過程在網上看的**,比較巧妙。。

精度問題,

除以2 用乘以0.5代替

#include #include #include #include #include #include #include #include #define pb push_back

#define sqr(x) ((x)*(x))

#define cube(x) ((x)*(x)*(x))

using namespace std;

const double eps = 1e-9;

const int maxn = 50;

int n, t;

vectort;

int dcmp(double x)

struct point

point(double xx, double yy):x(xx), y(yy){}

void input()

friend point operator + (const point& a, const point& b)

friend point operator - (const point& a, const point& b)

friend double operator * (const point& a, const point& b)

friend point operator * (const point& a, const double& k)

friend bool operator < (const point& a, const point& b)

int pre=m;

for (int i=n; i; i--)

return m;

}void get_abc(double& a, double& b, double& c, int i, int j, int k)

void solve(double a, double b, double c)

return;

}double delta = b*b - 4*a*c;

if (delta<0) return;

if (!dcmp(delta))

double tmp = sqrt(delta);

x = (-b+tmp)*0.5/a;

if (x>=0 && x<=t) t.pb(x);

x = (-b-tmp)*0.5/a;

if (x>=0 && x<=t) t.pb(x);

}int main()

t.clear();

t.pb(0); t.pb(t);

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

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

for (int k=j+1; k<=n; k++)

int tot=t.size();

sort(t.begin(), t.end());

double ans=0;

for (int i=0; i

hdu2045 c語言詳解

因為格仔數為1,2,3時為特殊情況,所以從4開始考慮,分為兩種情況,第一種情況 當第n 1個格仔與第乙個格仔不同時,因為題目要求第乙個格仔和最後乙個不相同,所以此時巧好能看成總共只有n 1個格仔,然後又回到有n格仔時,第n個格仔因為不和第乙個和第n 1個格仔相同,當第n 1個格仔和第乙個格仔確定時,...

hdu2043 密碼(C語言)

problem description 網上流傳一句話 常在網上飄啊,哪能不挨刀啊 其實要想能安安心心地上網其實也不難,學點安全知識就可以。首先,我們就要設定乙個安全的密碼。那什麼樣的密碼才叫安全的呢?一般來說乙個比較安全的密碼至少應該滿足下面兩個條件 1 密碼長度大於等於8,且不要超過16。2 密...

HDU 1004(C語言描述)

let the balloon rise 輸入輸入包含多個測試用例。每個測試用例都以數字 n 0 n 1000 為起點,分布的氣球總數。下 n 行包含乙個顏色。氣球的顏色是乙個多達15個小寫字母的字串。帶有 n 0 的測試用例終止輸入,並且不處理此測試用例.輸出對於每種情況,在單行上列印最流行問題的...