- 浏览: 380982 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- java编程 (4)
- java实用程序 (2)
- 算法设计 (34)
- 数据库 (8)
- ACM模板 (12)
- 技术术语 (1)
- java_web (3)
- php (22)
- eclipse (3)
- linux (25)
- linux命令使用心得 (3)
- web服务器 (8)
- IT知识 (2)
- 前端技术 (17)
- 开源软件 (5)
- vim (3)
- linux多线程 (9)
- web开发经验 (3)
- lua (5)
- linux编程 (3)
- smarty (1)
- mysql (4)
- Hive (2)
- 数据挖掘 (9)
- python (2)
- 生活 (1)
- C++ (2)
- 计算机 (1)
- objective-c (11)
- css (2)
- 游戏 (1)
- Mac (1)
最新评论
-
lr544463316:
我的怎么不行呀.....
Mysql Access denied for user ''@'localhost' to database 的一种解决方法 -
babaoqi:
使用时需要注意group_concat函数返回值的最大长度=g ...
mysql中的group_concat函数 -
代码能力弱成渣:
可以帮我看下我的代码么?我自己写的sam,也有ac过题的,但是 ...
求两个字符串的最长公共连续子序列(SAM实现) -
atgoingguoat:
有1000个?不过还是收藏下。
jquery常用的插件1000收集(转载)
source: http://poj.org/problem?id=3968
title: Jungle Outpost
题目简意:给出一个凸多边形,求至少删除多少个点后,多边形内的任意一点都得不到庇护。
/* 可以肯定,被移除的 这些点在凸多边形上是连续的,于是可以二分至少需要移除的点数k,然后 用ps[i]->ps[(i+mid+1)%n](0<=i<n)构造n条线段,对这n条线段代表的 半平面求交, 最后判断求出来的凸多边形的面积是否为0即可。 */ #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int N=50005; const double eps=1e-8; int sign(double d){ return d<-eps ? -1 : (d > eps); } struct point{ double x, y; point(double _x=0, double _y=0):x(_x), y(_y){} void read(){ scanf("%lf%lf", &x, &y); } void set(double _x, double _y){ x=_x; y=_y; } }ps[N], hull[N], pque[N]; struct seg{ point st, ed; double ang; void calang(){ ang = atan2(ed.y-st.y, ed.x-st.x); } }sque[N+10], segs[N+10]; int n; inline double xmul(point st1, point ed1, point st2, point ed2){ return (ed1.x - st1.x) * (ed2.y - st2.y) - (ed1.y - st1.y) * (ed2.x - st2.x); } point intersectPoint(point st1, point ed1, point st2, point ed2){ //求相交直线的交点 double t = xmul(st2, st1, st2, ed2) / ((ed1.y-st1.y) * (ed2.x-st2.x) - (ed1.x-st1.x) * (ed2.y-st2.y)); return point(st1.x+(ed1.x-st1.x)*t, st1.y+(ed1.y-st1.y)*t); } bool cmpseg(seg a, seg b){ return a.ang < b.ang; } //半平面交,第i个 半平面为segs[i].st->segs[i].ed的右侧,结果放在ps中确保不要有极端的 数据 //比如 相邻的 线段 虽然极角不一样但却平行! void halfPlaneInter(seg* segs, int sn, point* ps, int& pn){ int i, l, r; //由于问题的特殊性,这些线段已经是 有序的 了,并且不会有有两条线段极角相同 if(sn <= 0){ pn = 0; return; } if(sn <= 2){ segs[sn] = segs[0]; for(l = r = 0; r < sn; r++){ sque[r] = segs[r]; pque[r] = intersectPoint(segs[r].st, segs[r].ed, segs[r+1].st, segs[r+1].ed); } }else{ l = r = 0; sque[r++] = segs[0]; sque[r++] = segs[1]; pque[0] = intersectPoint(sque[0].st, sque[0].ed, sque[1].st, sque[1].ed); for(i = 2; i < sn; i++){ while(r-l >= 2 && sign(xmul(segs[i].st, segs[i].ed, segs[i].st, pque[r-2])) <= 0) r--; sque[r++] = segs[i]; pque[r-2] = intersectPoint(sque[r-2].st, sque[r-2].ed, sque[r-1].st, sque[r-1].ed); } //删除多余的 半平面 while(r-l >= 2){ bool flag = false; if(sign(xmul(sque[r-1].st, sque[r-1].ed, sque[r-1].st, pque[l])) <= 0){ flag = true; l++; } if(sign(xmul(sque[l].st, sque[l].ed, sque[l].st, pque[r-2])) <= 0){ flag = true; r--; } if(!flag) break; } //这里需要注意,最后的结果可能是一个无限平面. pque[r-1] = intersectPoint(sque[l].st, sque[l].ed, sque[r-1].st, sque[r-1].ed); } for(pn = 0, i = l; i < r; i++){ ps[pn++] = pque[i]; } } bool input(){ if(scanf("%d", &n)==EOF) return false; int i; for(i=0; i<n; i++){ ps[n-i-1].read(); //保证输入的点是逆时针的 } return true; } double area(point* ps, int pn){ if(pn<=1) return 0; int i; double ans; for(ps[pn]=ps[0], ans=i=0; i<pn; i++){ ans += (ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x); } return ans*0.5; } bool check(int mid){ int hn, i; for(i=0; i<n; i++){ segs[i].st=ps[i]; segs[i].ed=ps[(i+mid+1)%n]; } halfPlaneInter(segs, n, hull, hn); double s=area(hull, hn); return sign(s)==0; } void solve(){ int l, r, mid; l=1; r=(n-1)>>1; while(l<=r){ mid=(l+r)>>1; if(check(mid)){ r=mid-1; }else{ l=mid+1; } } int ans=r+1; printf("%d\n", ans); } int main(){ while(input()) solve(); return 0; }
发表评论
-
升序数组中求一个key出现的次数
2013-01-09 23:08 1072算法思路: 在排好序的数组,相同的数字是排列在一起的,所以只需 ... -
判断单链表是否有环
2013-01-08 19:07 891算法思路: 指针p1和p2的起始值均为链表的表头,指针p1每次 ... -
hdu3684
2011-11-15 20:11 898/* 刚开始打了个记录上下左右四个点的,一直tle。 ... -
hdu3686
2011-11-14 20:43 1009/* 无向图边的双连通分量,在同一个连通分量里的边之间 ... -
uva2819
2011-11-13 02:20 866source: http://livearchive.onli ... -
manacher算法
2011-11-11 00:06 2413const int LEN=110005; const ... -
hdu4118
2011-11-09 21:53 1167枚举每条边最多被经过的次数即可 #include ... -
hdu4115
2011-11-09 16:27 1001source: http://acm.hdu.edu.cn/ ... -
uva(Transitive Closure)
2011-11-08 14:45 885source: http://livearchive.onli ... -
zoj3500
2011-11-07 17:41 930求两个球的体积交或者并 #include <cs ... -
zoj3545
2011-11-04 18:18 845/* AC自动机 相当暴力的 解法: mark[i ... -
zoj3190
2011-11-04 17:34 1259/* * AC自动机,先对资源串和病毒串构成的字符串 ... -
zoj3228
2011-11-04 16:12 929/* * AC自动机,每个节点 添加一个d表示节点代 ... -
poj3691(DNA Repair)
2011-11-04 13:18 1456/* AC自动机,增设虚拟节点,求长度为n的字符串中包 ... -
hdu2825
2011-11-04 11:53 962/* AC自动机,增设虚拟节点,求长度为n的字符 ... -
hdu4095
2011-11-03 13:19 993/* 第一步,构建BST,用第一个数作为bst的 ... -
zoj3540
2011-11-02 21:33 897/* 其实就是把总共的 放置次数减去不能放置的那些就行 ... -
poj1741(树的分治,基于边的 分治)
2011-11-02 20:25 3329/* 树基于边的分治算法,计算树中距离小于等于k的点 ... -
hdu2939
2011-10-29 18:36 829source: http://acm.hdu.edu.cn/s ... -
hdu3982
2011-10-29 10:20 914//半平面交+多边形和圆的交的面积 #include ...
相关推荐
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
北大POJ1159-Palindrome 解题报告+AC代码
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj分类poj分类poj分类poj分类
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
北大POJ2002-Squares 解题报告+AC代码
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
POJ1048,加强版的约瑟夫问题 难度中等
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。
poj 1001答案
POJ2968代码有用,欢迎下载,POJ代码
Poj中一些题目的源代码,里面共有二十多道题目,OI
北大POJ3253-POJ3253-Fence Repair【STL优先队列】 解题报告+AC代码