日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于多边形内点数问题的一些变形

發(fā)布時(shí)間:2025/7/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于多边形内点数问题的一些变形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近兩次比賽出現(xiàn)兩道相同類型的題,有人十幾分鐘就AC了,而有人卡了倆小時(shí)。。。反思。。

?

?先說hdu4353這道題,題意是要求一個(gè)從N個(gè)點(diǎn)1里邊畫出一個(gè)多邊形來,然后給出M個(gè)點(diǎn)2。讓這個(gè)(多邊形的面積/多邊形內(nèi)點(diǎn)2的個(gè)數(shù))最小。

?描述很復(fù)雜。。。但是仔細(xì)想想會(huì)發(fā)現(xiàn),多邊形的點(diǎn)越多,面積也就越大,所以,這里只能畫三個(gè)點(diǎn),也就是一個(gè)三角形。至于怎么求點(diǎn)2的個(gè)數(shù),這是很有必要總結(jié)的,祭奠我那苦逼的倆小時(shí)吧。。。。

先看一個(gè)圖:?

這不是立體圖,僅僅是個(gè)平面圖。。。

假設(shè)sum[i][j]表示i,j這條線上方這塊區(qū)域的點(diǎn)的數(shù)目

可以看到三角形內(nèi)點(diǎn)2的數(shù)目 = sum[i][j] + sum[j][k] - sum[i][k];

其實(shí)更通用一點(diǎn)就是: abs(sum[i][k] - sum[i][j] - sum[j][k]);

既然統(tǒng)計(jì)出這些點(diǎn)數(shù)來,這個(gè)問題基本就解決了。

?HDU 4353的代碼:

View Code const int N = 210; const int M = 511;struct Point {int x, y;bool operator < (const Point& cmp) const {return x < cmp.x;} };Point a[N], b[M]; int sum[N][N]; int n, m;inline int det(int x1, int y1, int x2, int y2) {return x1*y2 - x2*y1; }inline int cross(Point a, Point b, Point c) {return det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y); }int main() {//freopen("data.in", "r", stdin);int i, j, k, t, cas = 0, cnt;double ans, area;scanf("%d", &t);while(t--) {scanf("%d%d", &n, &m);REP(i, n) scanf("%d%d", &a[i].x, &a[i].y);REP(i, m) scanf("%d%d", &b[i].x, &b[i].y);sort(a, a + n);for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {sum[i][j] = 0;for(k = 0; k < m; ++k) {if(b[k].x >= a[i].x && b[k].x < a[j].x) {if(cross(a[i], a[j], b[k]) > 0) sum[i][j]++;}}}}ans = -1;for(i = 0; i < n; ++i) {for(j = i + 1; j < n; ++j) {for(k = j + 1; k < n; ++k) {cnt = sum[i][k] - sum[i][j] - sum[j][k];if(cnt == 0) continue;area = double(cross(a[i], a[j], a[k]))/2;if(ans == -1 || fabs(area/cnt) < ans) ans = fabs(area/cnt);}}}if(ans == -1) printf("Case #%d: -1\n", ++cas);else printf("Case #%d: %.6lf\n", ++cas, ans);}return 0; }

?

? 還有一個(gè)就是多校9上的1001題(HDU 4380)。比上面這個(gè)題更直白,需要統(tǒng)計(jì)三角形內(nèi)的點(diǎn)數(shù)是不是奇數(shù)就可以。。。

?

?  

轉(zhuǎn)載于:https://www.cnblogs.com/vongang/archive/2012/08/22/2650887.html

總結(jié)

以上是生活随笔為你收集整理的关于多边形内点数问题的一些变形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。