description
jsoi的國境線上有n一座連續的山峰,其中第ii座的高度是hi??.為了簡單起見,我們認為這n座山峰排成了連續一條input直線.如果在第ii座山峰上建立一座高度為p(p≥0)的燈塔,jyy發現,這座燈塔能夠照亮第jj座山峰,當且僅當滿足如
下不等式:hj≤hi+p-sqrt(|i-j|)jsoi國王希望對於每一座山峰,jyy都能提供建造一座能夠照亮全部其他山峰的燈
塔所需要的最小高度.你能幫助jyy麼? 1< n ≤ 10^5 0 < hi ≤ 10^9
輸入一行包含乙個正整數n。 接下來n行,第i行包含乙個正整數ℎi,表示第i座山峰的高度。output
第i行包含乙個非負整數,表示在第i座山峰上修建燈塔所需要的最小高度pisample input sample output 題解
把式子推一下可以發現p>=hj
−hi+
sqrt
(i−j
) p
>=hj
−hi+
sqrt
(i−j
)於是答案就取ma
x(hj
−hi+
sqrt
(i−j))m
ax(h
j−hi
+sqr
t(i−
j)
)由於n<=100000,那麼最後一項最大不會超過314。題目中給定了p是大於等於0的,所以對於hj < hi的我們可以貪心地暫時不考慮
先按h排序,對於h相同的我們可以去重,只需要保留最左邊與最右邊的。每次詢問的時候,從最大的h開始列舉。如果當前列舉的h比最大的h小了超過314,可以直接退出。因為再列舉的話sq
rt(i
−j) sqr
t(i−
j)
也不能把這個差距補回來
所以複雜度就是o(
314n
) o
(314n)
啦 似乎與網上的思路都不一樣???
#include
#include
#include
#include
#include
using
namespace
std;
struct node
a[110000],b[110000];int n,len;
int answer[110000];
bool cmp(node n1,node n2)
len--;
// for(int i=1;i<=len;i++)printf("%d %d\n",b[i].h,b[i].op);
for(int i=1;i<=n;i++)
answer[cnt]=ans;
}for(int i=1;i<=n;i++)printf("%d\n",answer[i]);
return
0;}
刷題記錄(LA4850 貪心)
題目 如果是問最大懲罰值的最小值的話,只需要按截止時間從小到大排一下序就可以了。但問的是最大兩個懲罰值的最小值。有點沒辦法,一度以為有什麼操作能直接優化兩個數的和最小,好像不太行。在網上搜了題解看到乙個思路。先按截止時間排序,在嘗試把乙個任務a調到任務b後這樣a 1到b的懲罰值都得到優化而a的懲罰值...
貪心 bzoj 3008 象棋
本題的難點是 移動過程中不能出現多顆棋子同時在某一格的情況 事實上,可以忽略此條件,因為棋子是相同的,我們可以用合法的等效方案替代一棋子越過另一棋子的情況 a b c三格,a能在一步走到b,b也能在一步走到c。在a的棋子需要走到存在棋子的b,接著走到c。此情形我們可以看成在b的棋子先走到c,接著在a...
bzoj4029 貪心 定價
description 在市場上有很多商品的定價類似於 999 元 4999 元 8999 元這樣。它們和 1000 元 5000 元和 9000 元並沒有什麼本質區別,但是在心理學上會讓人感覺便宜很多,因此也是商家常用的 策略。不過在你看來,這種 十分荒謬。於是你如此計算乙個 p p 為正整數 的...