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