UPC 6888 守衛(區間dp)

2021-08-22 02:41:37 字數 1804 閱讀 6203

題目描述

九條可憐是乙個熱愛運動的女孩子。

這一天她去爬山,她的父親為了她的安全,僱了一些保鏢,讓他們固定地呆在在山的某些位置,來實時監視九條可憐,從而保護她。

具體來說,一座山可以描述為一條折線,折線的下方是岩石。這條折線有 n 個折點,每個折點上有乙個亭子,第i 個折點的座標是 (i,hi) 。九條可憐只可能會在亭子處玩耍,那些保鏢也只會在亭子處監視可憐。

由於技術方面的原因,乙個保鏢只能監視所有他能看得到的,橫座標不超過他所在位置的亭子。我們稱乙個保鏢能看到乙個亭子 p ,當且僅當他所在的亭子 q 和 p 的連線不經過任何一塊岩石。特別地,如果這條連線恰好經過了除了p,q以外的亭子,那麼我們認為保鏢看不到可憐。

僱傭保鏢是一件很費錢的事情,可憐的父親希望保鏢越少越好。

可憐的父親還希望得到詳盡的僱傭保鏢的方案,他知道有些亭子可能正在維修,他想對所有的 1≤l≤r≤n 計算:如果事先已知了只有區間 [l,r] 的亭子可以用來玩耍(和監視),那麼最少需要多少個保鏢,才能讓 [l,r] 中的每乙個亭子都被監視到。

可憐的父親已經得到了乙個結果,他希望和你核實他的結果是否正確。

輸入格式

第一行輸入乙個整數 n 表示亭子的數目。 接下來一行 n 個整數,第 i 個整數 hi​ 表示第 i 個亭子的座標是(i,hi)。

輸出格式

對所有的 1≤l≤r≤n 計算:如果事先已知了可憐只會在 [l,r] 這個區間的亭子裡面玩耍,那麼最少需要多少個保鏢,才能讓 [l,r] 中的每乙個亭子都被監視到。由於輸出量太大,可憐的父親只要你輸出所有 [l,r] 的答案的異或即可。

樣例

樣例輸入

2 3 1

樣例輸出

樣例解釋

如果 r−l+1≤2 ,那麼答案顯然是 1 。 如果 l=1,r=n ,那麼答案是2 ,需要安排兩個保鏢在 (2,3),(3,1) 兩個位置監視可憐。

資料範圍與提示

對於 30%30\%30% 的資料, n≤20。

對於 70%70\%70% 的資料, n≤500。

對於 100%100\%100% 的資料, n≤5000。

對於 100%100\%100% 的資料, h​i​≤10^​9​。

這道題有兩個要點:

1、如何判斷中間的某個點會不會擋住後面看前面的視線? 這個很好想 可以通過斜率 如果終點到障礙物的斜率大於終點到起點的斜率 那麼障礙物不會遮擋住終點看起點的視線

2、如何找到所有區間的最優解,這個就比較難想了。

採用線性dp的方法列舉左右端點,右端點從前往後列舉,但是左端點要從右端點往前列舉。

#includeusing namespace std;

int x[5003],y[5003],dp[5003][5003];

long long vis(int l,int k,int r)//判斷k點的障礙物會不會擋住r看l的視線

int getdp(int l,int r)

int main()

for(int r=1;r<=n;r++)//列舉右端點

dp[l][r]=cnt+min(getdp(l,obl-1),getdp(l,obl));

}for(int l=1;l注意:任何數異或自身為0,任何數異或零仍不變

688 單詞表示數字

2017.10.26 三位三位的讀,然後再加thousand million billion等單位。再讀每乙個三位的時候,後兩位需要特殊處理。此外就是空格的增加需要格外注意一些,這主要是針對幾個相連的0出現的情況。public class solution int count 0 while num...

688 畫圈遊戲 思維

688 畫圈遊戲 時間限制 1 sec 記憶體限制 128 mb 提交 狀態 討論版 題目描述 有一天,小樂和小希在玩遊戲,遊戲規則是這樣的,有一塊矩形的畫板,長為x,寬為y,兩個玩家在這個畫板上畫圓,圓心可以自己隨便確定,但是每乙個圓的半徑都是固定的r。每個人輪流畫圓,且畫板上畫的圓都不能重疊 可...

688 「馬」在棋盤上的概率

已知乙個 nxn 的西洋棋棋盤,棋盤的行號和列號都是從 0 開始。即最左上角的格仔記為 0,0 最右下角的記為 n 1,n 1 現有乙個 馬 也譯作 騎士 位於 r,c 並打算進行 k 次移動。如下圖所示,西洋棋的 馬 每一步先沿水平或垂直方向移動 2 個格仔,然後向與之相垂直的方向再移動 1 個格...