BZOJ 1020 安全的航線

2022-08-02 17:45:17 字數 4140 閱讀 9190

time limit: 5 sec  memory limit: 162 mb

submit: 1462  solved: 503

[submit][status][discuss]

在設計航線的時候,安全是乙個很重要的問題。首先,最重要的是應採取一切措施確保飛行不會發生任何事故

,但同時也需要做好最壞的打算,一旦事故發生,就要確保乘客有盡量高的生還機率。當飛機迫降到海上的時候,

最近的陸地就是乙個關鍵的因素。航線中最危險的地方就是距離最近的陸地最遠的地方,我們稱這種點為這條航線

「孤地點」。孤地點到最近陸地的距離被稱為「孤地距離」。作為航空公司的高階顧問,你接受的第乙個任務就是

盡量找出一條航線的孤地點,並計算這條航線的孤地距離。為了簡化問題,我們認為地圖是乙個二維平面,陸地可

以用多邊形近似,飛行線路為一條折線。航線的起點和終點都在陸地上,但中間的轉折點是可能在海上(如下圖所

示,方格標示出了孤地點)。

輸入的第一行包括兩個整數c和n(1≤c≤20,2≤n≤20),分別代表陸地的數目的航線的轉折點的數目。接下

來有n行,每行有兩個整數x,y。(x,y)表示乙個航線轉折點的座標,第乙個轉折點為航線的起點,最後乙個轉折點

為航線的終點。接下來的輸入將用來描述c塊大陸。每塊輸入由乙個正整數m開始(m≤30),m表示多邊形的頂點個

數,接下來的m行,每行會包含兩個整數x,y,(x,y)表示多邊形的乙個頂點座標,我們保證這些頂點以順時針或逆

時針給出了該多邊形的閉包,不會出現某些邊相交的情況。此外我們也保證輸入資料中任何兩塊大陸不會相交。輸

入的所有座標將保證在-10000到10000的範圍之間。

輸出乙個浮點數,表示航線的孤地距離,資料保留2位小數。

1 2-9 -6

5 13

0 16

-16 -12

17 -6

0.00

nwerc 2007

思路:用個佇列儲存所有要處理的線段。對每截線段分別求出端點s距多邊形的最近點a和t的最近點b,用sa和tb更新答案,在s、t之間找到p使得pa = pb,易知st上所有點對答案的貢獻都不超過pa,由此在此處剪枝。

如剪不掉,將兩截子線段都加入佇列中。

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21

22using

namespace

std;

2324

#define pau system("pause")

25#define ll long long

26#define pii pair27

#define pb push_back

28#define pli pair29

#define pil pair30

#define clr(a, x) memset(a, x, sizeof(a))

3132

const

double pi = acos(-1.0

);33

const

int inf = 0x3f3f3f3f;34

const

int mod = 1e9 + 7;35

const

double eps = 1e-9;36

37/*

38#include

39#include

40using namespace __gnu_pbds;

41#define tree tree, rb_tree_tag, tree_order_statistics_node_update>

42tree t;

43*/

4445

int sgn(double x)

46struct

point

49 point (double x, double

y) : x(x), y(y) {}

50 point operator + (const point &p) const

51 point operator - (const point &p) const

52 point operator * (const

double &k) const

53 point operator / (const

double &k) const

54double

operator ^ (const point &p) const

55double

operator | (const point &p) const

56bool

operator

< (const point &p) const

57double len2()

58double len()

59void input()

60void output()

61 } p[205

];62

#define pdp pair63

struct

line

66line (point s, point e) : s(s), e(e) {}

67 point operator & (const line &l) const

72bool

operator | (const point &p) const

78pdp dis(point p) else

else88}

89}

90double

len()

93 } l[205

];94

struct

state

99};

100struct

pol

109return res /s;

110}

111bool

hasp(point p)

123return

f;124

}125

pdp dis(point p)

132return

res;

133}

134void

input()

139for (int i = 1; i <= n; ++i)

142}

143 } pol[22

];144

intc, n;

145double

ans;

146void

solve()

151while

(que.size())

163 td =pol[i].dis(e);

164if (td.first

168}

169 ans =max(ans, max(ds, de));

170double sta = 0, en = 1

, mi;

171point tp;

172while (sta <= en -eps) else

181}

182if ((tp - a).len() < ans) continue

;183

que.push(line(s, tp));

184que.push(line(e, tp));

185}

186}

187int

main()

192for (int i = 1; i < n; ++i)

195for (int i = 1; i <= c; ++i)

198solve();

199 printf("

%.2f\n

", ans);

200return0;

201 }

view code

1020 電梯公升降

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 61 解決 32 某城市最高的建築只有一部電梯。乙份電梯公升降任務表由n個正整數組成,這些數字表示電梯按照給定的順序停留的樓層號。電梯公升一層花費6秒鐘,降一層花費4秒鐘,並且每次停留花費5秒鐘。對於每乙份任務表,你要計算出完成全部公升降任...

學習日誌(10 20)

今天主要講了linux中常用到的三大工具 編輯器vim 編譯器gcc 偵錯程式gdb 1.vim vim有三種模式 命令模式 只能移動游標,不能輸入。剛開啟檔案時進入的就是命令模式 插入模式 在命令模式下按a或i即可進入。底行模式 在命令模式下按 或 進入。命令模式下快捷鍵 x 刪除字元 數字x 刪...

10 20訓練總結

這幾天的話,並差集基本完事了,發現之前的有很多都是做過的題目,還有一些題目比較困難的,我放放在做,今天的話,報了乙個牛客網上的比賽,有的題目確實挺簡單的,可能是那個比賽就比較適合我們這種吧,但卻是還是沒什麼比較好的成績,其中就有乙個是有關快速冪的,需要一定推導,但是我沒有推導出來的,以為就是我相像的...