挑战程序竞赛系列（94）：3.6凸包（5）

挑战程序竞赛系列（94）：3.6凸包（5）

```import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Map;
import java.util.StringTokenizer;

public class Main{

String INPUT = "./data/judge/201710/P2079.txt";

public static void main(String[] args) throws IOException {
new Main().run();
}

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;
}

@Override
public int compareTo(P o) {
return x - o.x != 0 ? x - o.x : y - o.y;
}

}

int N;
P[] p;

double area(P a, P b, P c) {
double ans = (c.x - a.x) * (b.y - a.y) - (c.y - a.y) * (b.x - a.x);
return 0.5 * Math.abs(ans);
}

P[] convexHull() {
Arrays.sort(p);
P[] qs = new P[2 * N];
int k = 0;
for (int i = 0; i < N; ++i) {
while (k > 1 && qs[k - 1].sub(qs[k - 2]).det(p[i].sub(qs[k - 2])) < 0) k --;
qs[k++] = p[i];
}

for (int i = N - 2, t = k; i >= 0; --i) {
while (k > t && qs[k - 1].sub(qs[k - 2]).det(p[i].sub(qs[k - 2])) < 0) k--;
qs[k++] = p[i];
}

P[] res = new P[k - 1];
System.arraycopy(qs, 0, res, 0, k - 1);
return res;
}

void solve() {
P[] qs = convexHull();
int n = qs.length;
double ans = 0;

for (int offset = 1; offset < (n + 1) / 2; ++offset) {
int fir = 0;
int pos = (fir + offset + 1) % n;
do {
int sec = (fir + offset) % n;
while ((pos + 1) % n != fir && area(qs[fir % n], qs[sec % n], qs[(pos + 1) % n])
>= area(qs[fir % n], qs[sec % n], qs[pos % n])) {
pos = (pos + 1) % n;
}
ans = Math.max(ans, area(qs[fir % n], qs[sec % n], qs[pos % n]));
fir = (fir + 1) % n;
}
while (fir != 0);
}

out.printf("%.2f\n", ans);
}

while (true) {
N = ni();
if (N == -1) break;
p = new P[N];

for (int i = 0; i < N; ++i) {
p[i] = new P(ni(), ni());
}

solve();
}
}

FastScanner in;
PrintWriter out;

void run() throws IOException {
boolean oj;
try {
oj = ! System.getProperty("user.dir").equals("F:\\oxygen_workspace\\Algorithm");
} 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();
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 {
StringTokenizer st;
boolean hasNext;

public FastScanner(InputStream is) throws IOException {
hasNext = true;
}

public String nextToken() {
while (st == null || !st.hasMoreTokens()) {
try {
} 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 条评论

• 挑战程序竞赛系列（91）：3.6凸包（2）

挑战程序竞赛系列（91）：3.6凸包（2） 传送门：POJ 1113: Wall 题意参考hankcs： http://www.hankcs.com/pro...

• 挑战程序竞赛系列（90）：3.6凸包（1）

挑战程序竞赛系列（90）：3.6凸包（1） 传送门：POJ 2187: Beauty Contest 题意： 平面上有N个牧场。i号牧场的位置在格点(xi,y...

• 挑战程序竞赛系列（57）：4.6数列上的分治法

版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.n...

• 挑战程序竞赛系列（91）：3.6凸包（2）

挑战程序竞赛系列（91）：3.6凸包（2） 传送门：POJ 1113: Wall 题意参考hankcs： http://www.hankcs.com/pro...

• 挑战程序竞赛系列（90）：3.6凸包（1）

挑战程序竞赛系列（90）：3.6凸包（1） 传送门：POJ 2187: Beauty Contest 题意： 平面上有N个牧场。i号牧场的位置在格点(xi,y...

• as3中颜色矩阵滤镜ColorMatrixFilter的使用

上面的例子，也是游戏开发中比较常用的功能，与“怪物”战斗后，将其“灰”掉。这其中最重要的还是对AS3颜色矩阵滤镜(ColorMatrixFilter)的使用。

• 算法学习之栈与队列

Stack<E> void push(E) //入栈 E pop() //出栈 E peek() //查看 int getSize() //长度 bool...

• 挑战程序竞赛系列（41）：4.1中国剩余定理

版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.n...

• POJ 刷题系列：3299. Humidex

POJ 刷题系列：3299. Humidex 传送门：POJ 3299. Humidex 题意： 给定T， D， H中的任意两个数，求另外一个。 思路： ...