wyf從小就愛亂頂,但是頂是會造成位移的。他之前水平有限,每次只能頂出k的位移,也就是從乙個整點頂到另乙個整點上。我們現在將之簡化到數軸上,即從 乙個整點可以頂到與自己相隔在k之內的數軸上的整點上。現在wyf的頭變多了,於是他能頂到更遠的地方,他能頂到任意整點上。現在他在玩乙個遊戲,這個遊 戲裡他只能向正方向頂,同時如果他從i頂到j,他將得到a[j] * (j - i)的分數,其中a[j]是j點上的分數,且要求j > i, 他最後必須停在n上。
現給出1~n上的所有分數,原點沒有分數。他現在在原點,沒有分。wyf想知道他最多能得多少分。
第一行乙個整數n。
第二行有n個整數,其中第i個數表示a[j]。
乙個整數,表示wyf最多能得到的分數。
3
1 1 50
150
對於60%的資料,n<=1000;
對於100%的資料,n<=100000,0<=a[j]<=50。
解法一:dp。設 f [ i ] 表示從0到 i 點中最多能得到的分數。那麼f[ i ]=max。可以用斜率優化優化到o(n)。對於到達的每個點,若要知道應該從哪個點過來,則要比較從兩個不同地方過來的答案進行比較。最後比較式整理成類似於( f[ i ] – f[ j ] )/( i – j) > ? 的形式。之後可以將( i, f[ i ] )變為二維上的一點,比較式就成為了兩點間的斜率是否大於乙個數。由於 i 是從小到大列舉的則計算出乙個 f[ i ] 時就把它插入到二維平面裡,之後只需維護斜率下降的一段(斜率上公升的一段不需要考慮),用棧來儲存點,維護凸包總時間複雜度為o(n),找最好節點用二分。總時間複雜度為 o( n*log( n ) )。
解法二:貪心。首先有乙個結論,每次走到最大的乙個點肯定是最優的。
證明:
設當前在點l,有區間[ l, r ],其中r這個點是區間[ l , r ]的最大值。
所以我們可以將a[ i ]排序後每次看看能否跳,能跳就跳,這樣就保證跳的是最大的了。
#include#include#include#define n 100010
using namespace std;
int n,m,x,ans;
struct nodea[n];
bool cmp(node x,node y)
int main()
sort(a+1,a+1+n,cmp);
x=0;
for(int i=1;i<=n;i++)
} printf("%d\n",ans);
return 0;
}
JZOJ 4249 五校聯考7day1 遊戲
description wyf從小就愛亂頂,但是頂是會造成位移的。他之前水平有限,每次只能頂出k的位移,也就是從乙個整點頂到另乙個整點上。我們現在將之簡化到數軸上,即從 乙個整點可以頂到與自己相隔在k之內的數軸上的整點上。現在wyf的頭變多了,於是他能頂到更遠的地方,他能頂到任意整點上。現在他在玩乙...
五校聯考7day1 遊戲
description wyf從小就愛亂頂,但是頂是會造成位移的。他之前水平有限,每次只能頂出k的位移,也就是從乙個整點頂到另乙個整點上。我們現在將之簡化到數軸上,即從 乙個整點可以頂到與自己相隔在k之內的數軸上的整點上。現在wyf的頭變多了,於是他能頂到更遠的地方,他能頂到任意整點上。現在他在玩乙...
五校聯考7day1 遊戲
description wyf從小就愛亂頂,但是頂是會造成位移的。他之前水平有限,每次只能頂出k的位移,也就是從乙個整點頂到另乙個整點上。我們現在將之簡化到數軸上,即從 乙個整點可以頂到與自己相隔在k之內的數軸上的整點上。現在wyf的頭變多了,於是他能頂到更遠的地方,他能頂到任意整點上。現在他在玩乙...