結果

問題 No.245 貫け!
ユーザー suiginginsuigingin
提出日時 2015-07-19 21:38:14
言語 Java21
(openjdk 21)
結果
AC  
実行時間 247 ms / 5,000 ms
コード長 1,592 bytes
コンパイル時間 3,580 ms
コンパイル使用メモリ 77,760 KB
実行使用メモリ 42,244 KB
最終ジャッジ日時 2024-07-08 10:27:17
合計ジャッジ時間 8,043 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 135 ms
41,316 KB
testcase_01 AC 137 ms
41,216 KB
testcase_02 AC 137 ms
41,156 KB
testcase_03 AC 135 ms
41,420 KB
testcase_04 AC 133 ms
41,216 KB
testcase_05 AC 136 ms
41,420 KB
testcase_06 AC 133 ms
41,248 KB
testcase_07 AC 136 ms
41,364 KB
testcase_08 AC 152 ms
41,372 KB
testcase_09 AC 179 ms
41,796 KB
testcase_10 AC 156 ms
41,368 KB
testcase_11 AC 181 ms
41,624 KB
testcase_12 AC 223 ms
42,244 KB
testcase_13 AC 242 ms
41,812 KB
testcase_14 AC 224 ms
42,092 KB
testcase_15 AC 210 ms
41,968 KB
testcase_16 AC 247 ms
41,860 KB
testcase_17 AC 216 ms
41,952 KB
testcase_18 AC 228 ms
41,980 KB
testcase_19 AC 242 ms
41,836 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.Scanner;

public class No_245 {
	Scanner sc = new Scanner(System.in);

	int N;
	Point[][] p;

	void run() {
		N = sc.nextInt();
		p = pointArray(N);
		int max = 1;
		for (int i = 0; i < N; i++) {
			Point o1 = p[i][0];
			Point o2 = p[i][1];
			for (int j = 0; j < N; j++) {
				if (i == j) continue;
				Point p1 = p[j][0];
				Point p2 = p[j][1];
				max = Math.max(max, crossCnt(o1, p1, i, j));
				max = Math.max(max, crossCnt(o1, p2, i, j));
				max = Math.max(max, crossCnt(o2, p1, i, j));
				max = Math.max(max, crossCnt(o2, p2, i, j));
			}
		}
		System.out.println(max);
	}

	int crossCnt(Point s, Point t, int non1, int non2) {
		int cnt = 0;
		for (int i = 0; i < N; i++) {
			if (lineCross(s, t, p[i][0], p[i][1])) cnt++;
		}
		return cnt;
	}

	// 直線p1->p2と線分p3->p4が交わるかどうか判定
	// p1 != p2 でなければ破綻することに注意
	boolean lineCross(Point p1, Point p2, Point p3, Point p4) {
		if (p1.x == p2.x && p1.y == p2.y) return false;
		int a = (p1.x - p2.x) * (p3.y - p1.y) + (p1.y - p2.y) * (p1.x - p3.x);
		int b = (p1.x - p2.x) * (p4.y - p1.y) + (p1.y - p2.y) * (p1.x - p4.x);
		return a * b <= 0;
	}

	class Point {
		int x;
		int y;

		public Point(int x, int y) {
			super();
			this.x = x;
			this.y = y;
		}
	}

	public Point[][] pointArray(int n) {
		Point[][] res = new Point[n][2];
		for (int i = 0; i < n; i++) {
			res[i][0] = new Point(sc.nextInt(), sc.nextInt());
			res[i][1] = new Point(sc.nextInt(), sc.nextInt());
		}
		return res;
	}

	public static void main(String[] args) {
		new No_245().run();
	}
}
0