任務
【問題描述】
小a有n個任務,每個任務有一定的價值si
定義乙個三元組(i,j, k)如果三個ijk任務同時被選擇,那麼就會提供
的優美程度
反之,若其中至少有乙個任務沒有被選擇,那麼會提供
的優美程度
現在,小a可以人已決定選擇若干個任務,對於所有的有序可重三元組,他想要知道他能得到的最大優美程度和是多少,以及在最大化優美程度的基礎上,他想知道選擇的任務數量最少是多少
為了避免精度問題,你需要輸出對1000000007取模的值,注意你需要輸出的是最大優美度在mod意義下的值,不是最大模意義下的優美程度
【輸入】
輸入包括三行
第一行是乙個數字n,表示任務總共的任務數量
第二行包括n個書,第 i 個數字si表示每個任務的價值
【輸出】
第一行是最大優美程度
第二行是選擇的任務數量
【樣例輸入】
1 2 3
【樣例輸出】
【資料範圍】
對於10%的資料,保證n<=5
對於40%的資料,保證n<=10
對於70%的資料,保證n<=500
對於100%的資料,保證n<=10000000,1<=si<=n
首先我們要比較兩個式子,根據柯西不等式變換可以得到以下證明
(word敲公式真tm麻煩)
那麼任務就要選一定都要選才會是最大
那麼我們再看取等號的條件實際上是所有的數字都相等,當這個時候乾脆什麼都不取,滿足了最大同時最少
那麼計算的時候我們要展開分開求和
原始展開拆成兩個部分
code:
1 #include2 #include3over#define n 10000005
4using
namespace
std;
5long
long
inv[n],suminv[n],sumsq[n],sum[n];
6long
long
a[n];
7const
long
long mod=1e9+7
;8 inline void pre(long
long
n)13}14
intmain()29}
30long
long ans=((3*n*n)%mod*sum[n])%mod+(6*n)%mod*suminv[n]%mod*(sumsq[n]%mod)%mod;
31 cout
32if(flag)cout<
33else cout<<0
;34 }
NOIP模擬(10 19)T1 打牌
打牌 題目背景 10.19 noip 模擬t1 分析 dp or 貪心 本喵表示,這種小資料死都拍不出錯,大資料隨隨便便就錯的題,我也是喵了個咪的 打了對拍,打了暴力,然後拍了幾個小時,卵用 不吐槽了,本喵今天這個題只有 30分 貪心錯成智障 然後,標算還是貪心,首先我們知道出對子肯定更加好,我們直...
fjwc2019 D6T1 堆(組合數 打表)
193.2019冬令營提高組 堆 但是每個點都遍歷一遍,有些點的子樹完全相同卻重複算了 忽然記起完全二叉樹的性質之一 每個非葉節點的子樹中至少有乙個是滿二叉樹 那麼我們預處理滿二叉樹的那一塊,剩下的dfs就可以辣 求階乘.分塊打表 設打表分成 k 段,則複雜度 o logn n k includec...
7 24校內交流賽 T1 T2
乙個腦洞很大的題,將輸入的所有數異或起來輸出就好了 話說我為什麼這麼喜歡用異或啊 結論題 當某個字串長度恰巧為3 k 1時,從它往下的第3 k 1行恰好只決定於這個字串的左右兩個端點的值 includeusing namespace std inline intread intn,l char a ...