傳送門 to usoj
題目描述
小奇去遺跡探險,遺跡裡有 n
nn 個寶箱,有的裝滿了珠寶,有的裝著廢品。
小奇有地圖,所以它知道每乙個寶箱的價值,但是它不喜歡走回頭路,所以要按順序拿這 n
nn 個寶箱中的若干個。
拿寶箱很累的。一開始小奇的體力是 1
11 ,每得到乙個寶箱之後,小奇得到的價值是體力 ×
\times
× 寶箱的價值,之後它的體力就會變為原來的 k
kk 倍 。
小奇不喜歡連續放過很多寶箱,所以任意一段長度為 m
mm 的序列中,小奇一定要取走其中的乙個寶箱。
現在小奇想知道它能得到的最大價值和。
輸入格式
第一行,兩個整數 n,m
(1≤m
≤n
)n,m(1\le m\le n)
n,m(1≤
m≤n)
,表示的含義如題目中所述;
第二行,乙個不超過四位的小數 k(0
<
k<1)
k(0k(
0<
k<1)
,表示的含義如題目中所述;
第三行,n
nn 個整數,第 j
jj 個整數表示第 j
jj 個寶箱的價值。
輸出格式
輸出一行,乙個實數,表示小奇能得到的最大價值和,四捨五入保留兩位小數。
資料範圍與提示
n ≤1
05
n\le 10^5
n≤10
5 ,寶箱的價值絕對值不超過 109
10^9
109 。
將第 x
xx 個寶箱的價值記為 v
xv_x
vx 。
暴力用 f(x
,y,z
)f(x,y,z)
f(x,y,
z)表示前 i
ii 個點,上乙個是 j
jj ,已經拿了 k
kk 個。o(n
4)
\mathcal o(n^4)
o(n4
) 。跑出來了估計都退役了。
動態規劃
用 f (x
,y
)f(x,y)
f(x,y)
表示走到了x
xx點並且把它拿了,一共拿了 y
yy 個寶箱。那麼 f(x
,y)=
ky−1
vx
+maxu
=x−m
x−1f
(u,y
−1
)f(x,y)=k^v_x+\max_^f(u,y-1)
f(x,y)
=ky−
1vx
+maxu=
x−mx
−1f
(u,y
−1) 。本來是 o(n
3)
\mathcal o(n^3)
o(n3
) ,滑窗優化一下就 o(n
2)
\mathcal o(n^2)
o(n2
) 了。聽說用腳造資料的出題人這個做法放了你90分。
高階動態規劃
用 f (x
)f(x)
f(x)
表示從x
xx往後走並且把 x
xx 拿了。那麼!
f (x
)=vx
+k
⋅maxu
=x+1
x+mf
(u
)f(x)=v_x+k\cdot\max_^f(u)
f(x)=v
x+k
⋅u=x
+1maxx+m
f(u
)仍然滑窗,o(n
)\mathcal o(n)
o(n)
。奧妙重重!
#include
#include
#include
#include
#include
using
namespace std;
double
max(
const
double
&a,const
double
&b)const
int maxn =
100005
;const
double infty =
1e100
;int n, m, a[maxn]
;double k;
double dp[maxn]
;deque<
int> dq;
// 滑窗
void
pushinto
(int x)
dq.push_back
(x);
}int
main()
double ans =
-infty;
for(
int i=
1; i<=m;
++i)
ans =
max(ans,dp[i]);
printf
("%.2lf"
,ans)
;return0;
}
usOJ6149 英語危機
傳送門 題目描述 有一條數字長鏈,這條鏈上有些數字是相同的,有些地方是不同的,這條數鏈有很多種不同的可能。求最多有多少種可能的方案?為了簡化題目,數鏈沒有前導零。因為答案可能很大,所以你只需要輸出答案mod 109 7 mod10 9 7 mod109 7的結果。輸入輸出格式 輸入格式 第一行 兩個...
Elasticsearch5 5 2 心得筆記
centos7 es 5.4.3 wget 解壓。cd config 進入es配置資料夾 vi elasticsearch.yml 修改配置檔案修改配置項 cluster.name 可不配置 node.name 如果是單機版可不配置,如果是集群,則不同節點node.name應該不同 path.dat...
windows下編譯除錯mysql5 5 24原始碼
突然想學習下mysql,看看mysql的原始碼,首先就需要把原始碼編譯,這是學習它的第一步。萬事開頭難,一點也沒錯,昨天晚上搞了很久沒有弄好,今天回來第一件事就是把這個解決。問題總算解決,對該過程總結如下 2 解壓 新建了目錄,mysql,然後把解壓的檔案全部放在了這檔案裡 3 準備環境和工具 4 ...