Max Sum Array 贪心(2500)
生活随笔
收集整理的這篇文章主要介紹了
Max Sum Array 贪心(2500)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意 :
- 給一數組c=[c1,c2,...,cm]c=[c_1,c_2,...,c_m]c=[c1?,c2?,...,cm?],求構造一個長度為n的數組a=[a1,a2,...,an]a=[a_1,a_2,...,a_n]a=[a1?,a2?,...,an?],使得?i∈[1,m]\forall i \in [1,m]?i∈[1,m]恰好有cic_ici?個iii出現在數組aaa中
- 定義一個函數f(a)=∑1≤i<j≤n,ai=ajj?if(a)=\sum_{1 \leq i < j \leq n,a_i=a_j}j-if(a)=∑1≤i<j≤n,ai?=aj??j?i,求出f(a)f(a)f(a)的最大值,并且求出當f(a)f(a)f(a)最大時,aaa的構造方案
思路 :
- 容易想到一個貪心,注意到相同的數字間的距離越遠,對答案的貢獻越大,于是對數字大小從大到小來考慮,每次都拿出兩個放到aaa兩邊,這就是構造方法
- 接下來考慮對答案的貢獻以及方案數的計算
- 首先考慮對答案的貢獻,設當前aaa中還有numnumnum個位置沒排,當前排個數為iii的數,設有cnt[i]cnt[i]cnt[i]個,根據剛才的策略,容易得出對iii從大到小考慮。首先就是這cnt[i]cnt[i]cnt[i]個數依次放到數組兩邊,那么每個數字的貢獻就是num?cnt[i]?2+cnt[i]num-cnt[i]*2+cnt[i]num?cnt[i]?2+cnt[i]一共有cnt[i]cnt[i]cnt[i]個數字,乘起來,最后還要算上兩邊對中間的(i?2)?cnt[i](i-2)*cnt[i](i?2)?cnt[i]個數的貢獻(i?2)?cnt[i]?(num?cnt[i]?2+cnt[i])(i-2)*cnt[i]*(num-cnt[i]*2+cnt[i])(i?2)?cnt[i]?(num?cnt[i]?2+cnt[i])化簡后就是(num?cnt[i])?cnt[i]?(i?1)(num-cnt[i])*cnt[i]*(i-1)(num?cnt[i])?cnt[i]?(i?1) 每輪放數字結束后記得把num?=2?cnt[i]num-=2*cnt[i]num?=2?cnt[i],因為有這么多的位置被占了
- 方案數的話就很簡單了,對當前個數為1的時候進行特判,因為這個只能放一邊,其他的都是可以兩邊隨意放,所以就是cnt[i]!cnt[i]!cnt[i]!種,乘法原理即可
總結
以上是生活随笔為你收集整理的Max Sum Array 贪心(2500)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: X-Magic Pair gcd,剪枝(
- 下一篇: Edward Gaming, the C