週末訓練 征途

2021-09-29 06:29:12 字數 3144 閱讀 1378

【記憶體限制:$256mib$】【時間限制:$1000ms$】

【標準輸入輸出】【題目型別:傳統】【評測方式:文字比較】

$pine$開始了從$s$地到$t$

地的征途。

從$s$地到$t$地的路可以劃分成$n$段,相鄰兩段路的分界點設有休息站。

$pine$計畫用$m$天到達$t$地。除第$m$

天外,每一天晚上$pine$都必須在休息站過夜。所以,一段路必須在同一天中走完。

$pine$希望每一天走的路長度盡可能相近,所以他希望每一天走的路的長度的方差盡可能小。

幫助$pine$求出最小方差是多少。

設方差是$v$,可以證明,$v×m^2$是乙個整數。為了避免精度誤差,輸出結果時輸出$v×m^2$

。第一行兩個數$n,m$

第二行$n$個數,表示$n$段路的長度。

乙個數,最小方差乘以$m^2$後的值。

樣例輸入

521

2586

樣例輸出

36

對於$30\%$的資料,$1 \leq n \leq 10$

對於$60\%$的資料,$1 \leq n \leq 100$

對於$100\%$的資料,$1 \leq n \leq 3000$。

保證從$s$到$t$的總路程不超過$30000$。

找到了本題關鍵之後,打了個裸的$dp$,結果卡在初始化上面,後來發現這個裸$dp$可得$80pts$

看了看題目,發現題目要我們求的東西似乎沒怎麼給明,那麼我們首先應該手動化簡或者說是處理一下題目給出的公式$v*m^2$。

首先,我們設題目中的$n$個數$a_1,a_2......a_n$通過某種方式的組合後變為$m$個數$x_1,x_2......x_m$。

令$s=\sum_^x_i$

那麼通過方差公式可得

$$v=\frac^(x_i-\frac)}$$

通過平方差公式展開,可得

$$v=\frac^(^2+\frac-2x_i\frac)}$$

而我們要求的是$v×m^2$,不要忘記$m^2$,現在將$m^2$乘進去,可得

$$v*m^2=m\cdot \sum_^(^2+\frac-2x_i\frac)$$

將括號開啟,可得

$$vm^2=m\sum_^^2+m^2\frac-2m\frac\sum_^x_i$$

因為$s=\sum_^x_i$,所以我們還可以將這個式子化簡,可得

$$vm^2=m\sum_^^2+s^2-2s^2$$

最後,可以得到

$$v×m^2=m\sum_^^2-s^2$$

在這個式子中,$m$與$s$都是已知的,所以我們只需使求和部分最大即可。

然後開始$dp$:令

$dp[j][i]$:前$i$個數$a_i$組合成$j$個數$x_j$後平方求和$x_j$的最大值。

$s[i]$:字首和不解釋。

那麼就有狀轉$$dp[j][i]=max\$$

然後我們可以碼出$80pts$的**:

#includeusing

namespace

std;

#define int long longtemplate

inline void qread(t&x)

template

inline void qread(t& x,args&... args)

inline

intrqread()

template

inline t max(const t x,const t y)

template

inline t min(const t x,const t y)

template

inline t fab(const t x)

const

int maxn=3000

;int n,m,a[maxn+5],s[maxn+5],dp[maxn+5][maxn+5

];signed main()

這是乙個裸的$dp$,可以發現其時間複雜度為$o(nm^2)$,對於最大的$n$為$3000$時,還是會超時的。

考慮為其優化,再看其形式,發現其形如$f(x)=max\+tmp$,那麼這個時候我們就要斜率優化一下。

然後,可以硬扯下一維,最終時間複雜度為$o(nm)$,**如下:

#includeusing

namespace

std;

#define int long longtemplate

inline void qread(t&x)

template

inline void qread(t& x,args&... args)

inline

intrqread()

template

inline t max(const t x,const t y)

template

inline t min(const t x,const t y)

template

inline t fab(const t x)

const

int maxn=3000

;const

int buffer_size=3000

;int n,m,a[maxn+5],s[maxn+5],dp[maxn+5][maxn+5

];int q[buffer_size+5

],head,tail;

inline

void init()

inline

double calc(const

int j,const

int k,const

int l)

inline

int getdp(const

int j,const

int i,const

int k)

signed main()

}printf(

"%lld\n

",m*dp[m][n]-s[n]*s[n]);

return0;

}

週末訓練 逛公園

記憶體限制 512mib 時間限制 3000ms 標準輸入輸出 題目型別 傳統 評測方式 文字比較 策策每天都會去逛公園,他總是從 1 號點進去,從 n 號點出來。策策喜歡新鮮的事物,他不希望有兩天逛公園的路線完全一樣,同時策策還是乙個特別熱愛學習的好孩子,他不希望每天在逛公園這件事上花費太多的時間...

週末訓練筆記(三)

感覺這兩天受到了一萬點的傷害,也越發的感覺到了自己的不足,這兩天的比賽就ac了一道題,還有一道題感覺思路是對的,但是不知道為什麼過不了。1.輸入維多利亞和她丈夫的屬相,然後判斷他們的年齡差幾歲。解題思路 把12個屬相存到乙個陣列中然後根據不同的情況有正反兩種迴圈,迴圈到和他們屬相相同的元素的下標存起...

5 13 週末訓練

周天的比賽做的實在是不怎麼樣,比賽大都是思維題,這方面的確該加強一下了。b ran and the lock code 給出兩個數n和a,n代表區間長度,a表示該區間和的平均值。問在長度為n的序列中最多有多少個不相同的元素在平均值為a的前提下。當時做的時候,wa了好幾遍,一直以為直接模擬一下就可以出...