題面
資料範圍不大,顯然的dp模型。狀態也很容易定出來:設f[
i][j
] 表示把前i個單元樓劃分成j個小區的最大擁擠程度。那麼有動規方程:f[
i][j
]=ma
x(f[
k][j
−1]+
abs(
(sum
a[i]
−sum
a[k]
)−(s
umb[
i]−s
umb[
k]))
) 時間複雜度o(
n2k)
。主要是注意小細節,要麼對f[
i][1
] 特殊處理,要麼先把初值全部賦為−i
nf再把f[
0][0
] 賦為0。這麼做是因為,f[
i][1
]實際上不存在什麼決策,一定就是ab
s(su
ma[i
]−su
mb[i
])。如果迴圈按照上面的方式進行就會出現問題,出現「有的單元樓沒有被分進小區」的情形。考試時就因為這個白白丟掉50分。
所以吸取教訓,dp時,如果不太影響**實現的複雜度,如果求最大值,最好一開始把初值都賦為−i
nf;如果求最小值,最好把初值都賦為in
f 。尤其要注意特殊情況的初值。
#include
#include
#define dd double
#define maxn 805
#define maxk 85
using namespace std;
int n,k;
dd a[maxn],b[maxn],f[maxn][maxk];
int main()
printf("%.6lf",f[n][k]);
}
計蒜客NOIP2018模擬1
t1 最失敗的一道題,其實就是道水題,好幾種寫法,一種都沒想出來。題意轉化後就是 每個數可以選a i 和a i k,最後求使1,2,3,t都存在的最大的t 1和最多能讓多少個數小於等於t。為什麼第一問可以轉化成求有多少個數小於等於t呢?首先不大於k的怪物可以直接殺死,然後大於k的怪物顯然當且僅當血量...
計蒜客藍橋杯模擬賽心得
1.有趣的數字 我們稱乙個數是質數,而且數字 現了 55 的數字是有趣的。例如 5,59,457 都是有趣的,而 15,7 不是。求 1 到 100000 中有趣的數的個數。思路 其實很簡單,1 判斷是否為素數 2 位數是否含有5 注意點 剛開始以為要總數減去1,就是15這個數,後來才發現15不是素...
計蒜客 劃分整數(dp)
劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nn n 分解成不多於 kk k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1 n ...