パイプ POJ - 1039
トピックリンク:https://vjudge.net/problem/POJ-1039
問題の意味:管壁、全く同一の横軸の対応する各点の下壁、上壁の縦軸の縦マイナス1、完全に導管を通る光かどうかを求めて、そうでなければ取得でき上の各点の座標を与えられました最大値
アイデア:それは件名が最大値を持つ行がある場合、確かにこのラインを平行移動させることによって、私たちができることを、下壁の上壁に頂点と頂点を介して回転可能に、線分と交差していますすべてのポイント、および下部の頂点に接続された頂点線を介して、曲げ線及び他のパイプ交差の決意は、最大値が、各交差点を交差することができれば、それは予約を完全に貫通している、払いたくはなりません。
1 // 2 // 2020年1月14日にHJYLによって作成されます。 3 // 4の#include <stdio.hに> 5の#include <iostreamの> 6の#include <アルゴリズム> 7の#include <cmath> 8の#include <ベクトル> 9の#include < ストリング > 10の#include <CStringの> 11の#include <iomanip> 12 使って 名前空間はstdを、 13 CONST INT MAXN = 100 + 10 。 14の CONST ダブル EPS = 1E- 8 。 15 構造体ポイント{ 16 ダブルX、Y。 17 }。 18 19 ダブルクロス(点p1、点p2、点P0) 20 { 21 リターン(p1.x-P0.X)*(p2.y-p0.y) - (p2.x-P0.X)*(P1 .y- p0.y)。 22 } 23 24 BOOL ZX(ポイント、点B、点C、点D) 25 { 26 ダブル TMP =クロス(C、B)* クロス(D、B)。 27 であれば(ファブ(TMP)<EPS || TMP < 0 ) 28 リターン 真。 29 他に 30 のリターン 偽; 31 } 32 33 二重getpoint(点A、点B、点C、点D) 34 { 35 二重 AA =副AY。 36 ダブル BB = AX- BX。 37 二重 CC =(BX-AX)* ay-(バイAY)* 斧。 38 二重 AAA = dy- CY。 39 ダブル BBB = CX- DX。 40 二重 CCC =(DX-CX)* CY-(DY-CY)* CX。 41 二重 X =(CCC * BB-CC * BBB)/(AA * BBB-AAA * BB)。 42 二重 Y =(CC * AAA、CCC * AA)/(AA * BBB-AAA *BB); 43 リターンX。 44 } 45 46 のint main()の 47 { 48 INT N。 49 ブールフラグ。 50 ; MAXN]上記、[MAXN]以下ポイント 51 52 ながら(〜のscanf(" %d個"、&N)&& N) 53 { 54 のためには、(INTは私= 0 ; I <N; iが++ ) 55 { 56 のscanf(" %LF%LF "、および[I]上記。 X、及び上記[I] .Y)。 57 [I] .X =以下、上記[I] .X 58 以下の[I] .Y = [I] .y-上記1 。 59 } 60 ダブルヘッド= [上記0 ] .X。 61 フラグ= 偽。 62 int型のk。 63 のための(INTは私= 0!、I <N &&フラグ; I ++ ) 64 { 65 のために(INT J = 0 ; J <N &&フラグ;!J ++ ) 66 { 67 であれば(I == j)は 68 休憩; 69 のための(K = 0、K <N、K ++ ) 70 { 71 であれば(![I]上記、[J]以下、[K]上記、[K]以下ZX())// IJ连成的线是否与K管道相交 72 ブレーク。 73 } 74 であれば(K == N) 75 フラグ= 真。 76 他の 場合(K> MAX(i、j)は) 77 { 78 ヘッド= MAX(上記ヘッド、getpoint(上記[I]、[J]以下、[K- 1 ]、[K]上記))。 79 ヘッド= MAX(頭部、getpoint(上記[I]、[J]以下、下記の[K- 1 ]、[K]以下))。 80 } 81 } 82 } 83 であれば(フラグ) 84 のprintf(" 全ての配管を介して\ N。" ); 85 他の 86 のprintf(" %.2lf \ N " 、頭)。 87 } 88 リターン 0 。 89 }