time limit: 10 sec
memory limit: 128 mbsec
special judge
submit: 327
solved: 151 [
submit][
status][
discuss]
26.0 2.0 0.0
0.0 0.0 0.0
2.0 -2.0 1.5707963268
21.66
本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為
pi/2(pi為圓周率),則其凸包的周長為16+4*sqrt(2)
[submit][
status][
discuss]
題解:凸包
以圓心為點做凸包,然後求凸包的周長,最後加上乙個圓的周長。
#include#include#include#include#include#define n 100003
using namespace std;
int n,m;
double a,b,r,pi=acos(-1.0);
struct vector
}p[n],ch[n];
bool operator
int k=m;
for (int i=n;i>=1;i--)
m--;
}int main()
{ freopen("a.in","r",stdin);
freopen("my.out","w",stdout);
scanf("%d",&n);
scanf("%lf%lf%lf",&a,&b,&r);
int cnt=0;
for (int i=1;i<=n;i++) {
double x,y,rad;
scanf("%lf%lf%lf",&x,&y,&rad);
double l=a-2.0*r; l/=2.0;
double d=b-2.0*r; d/=2.0; vector v;
p[0]=vector(x,y);
p[++cnt].x=x+d; p[cnt].y=y+l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;
p[++cnt].x=x-d; p[cnt].y=y-l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;
p[++cnt].x=x+d; p[cnt].y=y-l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;
p[++cnt].x=x-d; p[cnt].y=y+l; v=rotate(p[cnt]-p[0],rad); p[cnt]=p[0]+v;
// for (int j=cnt;j>=cnt-4+1;j--)
// cout<
bzoj2829 信用卡凸包 凸包
26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 21.66 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為 pi 2 pi為圓周率 則其凸包的周長為16 4 sqrt 2 題解 把邊上的圓去掉然後求一遍凸包,最後再加上乙個圓...
BZOJ 2829 信用卡凸包 凸包
傳送門 bzoj2829 太zz了,這麼水的題都沒想出來。如果是矩形,凸包上的點一定都是矩形的頂點,gra ha mgraham graham 求出凸包後將每個頂點的尖角轉成圓弧,貢獻不好算。於是將矩形的頂點轉成四個1 4 frac 14 41 圓的圓心,求出凸包周長後 乙個圓的周長即可。直接貼黃學...
BZOJ2829 信用卡凸包
標籤 凸包 題目傳送門 description input output sample input 26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 sample output 21.66 hint 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5...