挑战程序竞赛系列(91):3.6凸包(2)
来源:互联网 发布:决战武林宠物升级数据 编辑:程序博客网 时间:2024/06/10 13:37
挑战程序竞赛系列(91):3.6凸包(2)
传送门:POJ 1113: Wall
题意参考hankcs:
http://www.hankcs.com/program/algorithm/poj-1113-wall.html
题意:
墙:有个愚蠢的皇帝要你造墙将城堡围起来,城堡的顶点有N个,墙必须离城堡的边至少L单位远,并且墙的总长度尽量小。求此长度?
所以求最大凸包把所有的点都围起来即可,但是为了保证围墙的距离最少,拐点用半径为L的圆包围起来,此题巧妙之处在于,凸包的所有踵点的周长实际就是一个圆的周长。
代码如下:
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Arrays;import java.util.StringTokenizer;public class Main{ String INPUT = "./data/judge/201709/P1113.txt"; public static void main(String[] args) throws IOException { new Main().run(); } static final int MAX_N = 1000 + 16; static final double PI = Math.acos(-1.0); class P implements Comparable<P>{ int x; int y; P(int x, int y){ this.x = x; this.y = y; } P sub(P a) { return new P(x - a.x, y - a.y); } int det(P a) { return x * a.y - y * a.x; } int dot(P a) { return x * a.x + y * a.y; } @Override public int compareTo(P o) { return this.x != o.x ? this.x - o.x : this.y - o.y; } } int N, L; P[] ps; double dist(P a, P b) { return Math.sqrt(a.sub(b).dot(a.sub(b))); } P[] convexHull() { Arrays.sort(ps); P[] qs = new P[N * 2]; int k = 0; for (int i = 0; i < N; qs[k++] = ps[i++]) { while (k > 1 && qs[k - 1].sub(qs[k - 2]).det(ps[i].sub(qs[k - 1])) <= 0) k --; } for (int i = N - 2, t = k; i >= 0; qs[k++] = ps[i--]) { while (k > t && qs[k - 1].sub(qs[k - 2]).det(ps[i].sub(qs[k - 1])) <= 0) k --; } P[] res = new P[k - 1]; System.arraycopy(qs, 0, res, 0, k - 1); return res; } void solve() { P[] qs = convexHull(); double res = 0; int n = qs.length; for (int i = 0; i < n; ++i) { res += dist(qs[i], qs[(i + 1) % n]); } out.printf("%.0f\n", 2 * PI * L + res); } void read() { N = ni(); L = ni(); ps = new P[N]; for (int i = 0; i < N; ++i) { ps[i] = new P(ni(), ni()); } solve(); } FastScanner in; PrintWriter out; void run() throws IOException { boolean oj; try { oj = ! System.getProperty("user.dir").equals("F:\\java_workspace\\leetcode"); } catch (Exception e) { oj = System.getProperty("ONLINE_JUDGE") != null; } InputStream is = oj ? System.in : new FileInputStream(new File(INPUT)); in = new FastScanner(is); out = new PrintWriter(System.out); long s = System.currentTimeMillis(); read(); out.flush(); if (!oj){ System.out.println("[" + (System.currentTimeMillis() - s) + "ms]"); } } public boolean more(){ return in.hasNext(); } public int ni(){ return in.nextInt(); } public long nl(){ return in.nextLong(); } public double nd(){ return in.nextDouble(); } public String ns(){ return in.nextString(); } public char nc(){ return in.nextChar(); } class FastScanner { BufferedReader br; StringTokenizer st; boolean hasNext; public FastScanner(InputStream is) throws IOException { br = new BufferedReader(new InputStreamReader(is)); hasNext = true; } public String nextToken() { while (st == null || !st.hasMoreTokens()) { try { st = new StringTokenizer(br.readLine()); } catch (Exception e) { hasNext = false; return "##"; } } return st.nextToken(); } String next = null; public boolean hasNext(){ next = nextToken(); return hasNext; } public int nextInt() { if (next == null){ hasNext(); } String more = next; next = null; return Integer.parseInt(more); } public long nextLong() { if (next == null){ hasNext(); } String more = next; next = null; return Long.parseLong(more); } public double nextDouble() { if (next == null){ hasNext(); } String more = next; next = null; return Double.parseDouble(more); } public String nextString(){ if (next == null){ hasNext(); } String more = next; next = null; return more; } public char nextChar(){ if (next == null){ hasNext(); } String more = next; next = null; return more.charAt(0); } }}
阅读全文
0 0
- 挑战程序竞赛系列(91):3.6凸包(2)
- 挑战程序竞赛系列(90):3.6凸包(1)
- 挑战程序竞赛系列(92):3.6凸包(3)
- 挑战程序竞赛系列(93):3.6凸包(4)
- 挑战程序竞赛系列(94):3.6凸包(5)
- 挑战程序竞赛系列(83):3.6计算几何基础
- 挑战程序竞赛系列(82):4.3 LCA(2)
- 挑战程序竞赛系列(85):3.6极限情况(2)
- 挑战程序竞赛系列(88):3.6平面扫描(2)
- 挑战程序竞赛系列(81):4.3 LCA(1)
- 挑战程序竞赛系列(1):2.3动态规划
- 挑战程序竞赛系列(4):2.1深度优先搜索
- 挑战程序竞赛系列(5):2.1广度优先搜索
- 挑战程序竞赛系列(6):2.1穷尽搜索
- 挑战程序竞赛系列(9):2.4优先队列
- 挑战程序竞赛系列(10):2.4并查集
- 挑战程序竞赛系列(11):2.5最短路径
- 挑战程序竞赛系列(12):2.5最小生成树
- [bzoj4597][Shoi2016]随机序列 线段树
- 浅谈AP聚类算法-matlab
- 开博首篇
- SpringCloud基础(5)
- 归并排序
- 挑战程序竞赛系列(91):3.6凸包(2)
- Thread类的sleep()方法和对象的wait()方法都能使线程暂停执行,他们有什么区别?
- 《红楼梦》的方位观念
- OSG可绘制体Drawable
- EBS中调用fnd_profile.value(GL_ACCESS_SET_ID)取不到值的情况
- 什么是图灵测试
- [caioj]KMP总结(?)
- Could not find method runProguard() for arguments [false] ……和 Error: Library projects canno
- EventBus的使用