HDOJ-WARMUP2 部分题解(不断更新)
2013-09-12 19:27
323 查看
1001:水题
1005:计算几何
这是本人第一次写计算几何题,我还是觉得模板要用自己写的,否则真是各种不舒服。。
首先考虑三点共线的情况,若第4个点在这个线段上,则为Danger,否则safe
三点不共线的时候,果断想外接圆,但byijie跟我说不对,因为钝角三角形时,面积最小的圆应该是以长边为直径的圆,这样的话,枚举四个圆即可,一个外接圆,三个以三条边为直径的圆。比赛的时候当然没写完,后来写了写,有些细节处理又请教了byijie...1A。。。附代码:
1007:刚开始想多了,竟然用了数位DP,后来发现过的人很多,觉得不对劲,感觉有简单方法,果真如此。因为每连续10个数有且仅有1个符合题目要求的数,这下OK,注意细节,WA了2次吧。。。。晕。。
1012:水题
1005:计算几何
这是本人第一次写计算几何题,我还是觉得模板要用自己写的,否则真是各种不舒服。。
首先考虑三点共线的情况,若第4个点在这个线段上,则为Danger,否则safe
三点不共线的时候,果断想外接圆,但byijie跟我说不对,因为钝角三角形时,面积最小的圆应该是以长边为直径的圆,这样的话,枚举四个圆即可,一个外接圆,三个以三条边为直径的圆。比赛的时候当然没写完,后来写了写,有些细节处理又请教了byijie...1A。。。附代码:
#include <iostream> #include <cstdio> #include <cmath> #define eps 1e-7 #define zero(x) (((x)>0?(x):-(x))<eps) using namespace std; struct point { double x; double y; point(){} point(double xx,double yy) { x=xx;y=yy; } }; struct Xl { double x; double y; Xl(point p1,point p2) { x=p1.x-p2.x; y=p1.y-p2.y; } }; point A,B,C,D; double xmax,xmin; double dist(point p,point q) { return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y)); } double crosspoint(point &O,point P,point Q,Xl l1,Xl l2) { double fzy=(P.x-Q.x)*(l1.x*l2.x)+P.y*l1.y*l2.x-Q.y*l2.y*l1.x; double fmy=l1.y*l2.x-l2.y*l1.x; O.y=fzy/fmy; O.x=(P.x*l1.x+P.y*l1.y-O.y*l1.y)/l1.x; return dist(O,A); } double cha(Xl s1,Xl s2) { return s1.x*s2.y-s1.y*s2.x; } int pd() { Xl s1(A,B); Xl s2(B,C); if (zero(cha(s1,s2))) { Xl s3(A,D); if (zero(cha(s1,s3))) { if (xmin<D.x-eps&xmax>D.x+eps) return 1; else return 0; } else return 0; } else { point E((A.x+B.x)/2,(A.y+B.y)/2); point F((B.x+C.x)/2,(B.y+C.y)/2); point G((A.x+C.x)/2,(A.y+C.y)/2); point O; double rmin=crosspoint(O,E,F,s1,s2); double dr=dist(O,D); if (dist(E,C)<dist(E,A)-eps) { if (dist(E,A)<rmin-eps) { rmin=dist(E,A); dr=dist(E,D); } } if (dist(F,A)<dist(F,B)-eps) { if (dist(F,B)<rmin-eps) { rmin=dist(F,B); dr=dist(F,D); } } if (dist(G,B)<dist(G,A)-eps) { if (dist(G,A)<rmin-eps) { rmin=dist(G,A); dr=dist(G,D); } } if (dr>rmin+eps) return 0; else return 1; } } int main() { int T,i,cas; cin>>T; for (cas=1;cas<=T;cas++) { cin>>A.x>>A.y; xmax=A.x;xmin=A.x; cin>>B.x>>B.y; if (B.x>xmax) xmax=B.x; if (B.x<xmin) xmin=B.x; cin>>C.x>>C.y; if (C.x>xmax) xmax=C.x; if (C.x<xmin) xmin=C.x; cin>>D.x>>D.y; int stat=pd(); if (stat) printf("Case #%d: Danger\n",cas); else printf("Case #%d: Safe\n",cas); } return 0; }
1007:刚开始想多了,竟然用了数位DP,后来发现过的人很多,觉得不对劲,感觉有简单方法,果真如此。因为每连续10个数有且仅有1个符合题目要求的数,这下OK,注意细节,WA了2次吧。。。。晕。。
1012:水题
相关文章推荐
- Discuz common.inc.php 部分解释-不断更新
- 网络流24题 题解 (部分) 更新中
- PHP部分---字符串处理(文中例子不断更新);
- bjoi2016题解<不断更新<毕竟自己弱嘛TAT>>
- 页面分部分加载呈现收集(不断更新中)
- 机器学习部分推荐论文列表(不断更新中ing...)
- leetcode 题解 翻译 C语言 Python 合集 (不断更新)
- 【网络流24题】----题解(部分,持续更新...)
- nc命令的部分用法和举例(不断更新)
- 2013多校联合1部分题解(更新中)
- 计算几何资料及题解[本日志会不断更新]
- MFC代码片段备忘(不断更新)
- 实例表现ibatis的基础用法(不断更新)
- Latex个人常用清单--不断更新
- JQuery的一些站点,不断更新中.
- linux应用技巧总结(不断更新)
- my eclipse中一些快捷方式(会不断更新)
- 学习Torch框架的该看的资料汇总(不断更新)
- 不断更新的连接。。。
- HDOJ 1556 Color the ball (线段树+区间更新)