在某塊平面土地上有n個點,你可以選擇其中的任意四個點,將這片土地圍起來,當然,你希望這四個點圍成【分析】的多邊形面積最大。
第1行乙個正整數n,接下來n行,每行2個數x,y,表示該點的橫座標和縱座標。
最大的多邊形面積,答案精確到小數點後3位。
50 0
1 01 1
0 10.5 0.5
1.000
資料範圍 n<=2000, |x|,|y|<=100000
這個叫旋轉 qia 殼?
好吧,去偷個gif回來。。
其實還是形象生動,旋轉卡殼是算點到線段的距離的,就是兩條線掃啊掃,有點單調的意思。
這題裡,列舉四邊形的對角線,然後兩邊找離這條線段的最遠的點,可以證明這些點都是在凸包上的(好像很明顯??)
就直接在凸包上找,假設已經列舉了線段x-y,現在列舉x-y+1,卡殼線不斷逆時針旋轉就可以了(我的打法是逆時針旋轉),因為前面去掉的點以後肯定也沒有用的,嗯。。
然後,這裡要用到平面差積,差積的值是有正負的,所以用差積算面積的時候要小心一點。然後也是用差積比較斜率的。。
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 201089
intn;
1011
const
double eps=0.000001;12
struct pa[maxn],c[maxn];
13int
len;
1415
double mymax(double x,double y)
16double myabs(double x)
1718 p operator -(p x,p y)
1924
25int dcmp(double
x)26
30bool cmp(p x,p y)
31double dot(p x,p y)
32double cross(p x,p y)
3334
void
chull()
3543
int k=len;
44for(int i=n-1;i>=1;i--)
4549 len--;50}
5152
double ans=0;53
void rc()//
rotating calipers
5466}67
}686970
intmain()
7177
chull();
78rc();
79 printf("
%.3lf\n
",ans/2
);80
return0;
81 }
2016-12-10 09:44:52
有一篇很好的講旋轉卡殼的博:
bzoj1069 凸包 旋轉卡殼
問題 在若干個點中取四個點,求圍成的四邊形的最大面積。思路 先求個凸包,n 2 列舉對角線,然後旋轉卡殼o 1 更新左右邊界即可。include include include include include include include include include include inclu...
BZOJ 1069 求凸包 旋轉卡殼
思路 求凸包 先按照x軸排個序 從左往右掃一遍 找到上凸殼 用叉積 再從右往左掃一遍 求下凸殼 搞個旋轉卡殼就好啦 嗯 我手懶 用的c complex庫 巨好用!by siriusren include include include using namespace std define cplex...
BZOJ 1069 求凸包 旋轉卡殼
思路 求凸包 先按照x軸排個序 從左往右掃一遍 找到上凸殼 用叉積 再從右往左掃一遍 求下凸殼 搞個旋轉卡殼就好啦 嗯 我手懶 用的c complex庫 巨好用!by siriusren include include include using namespace std define cplex...