一本通 1 1 練習 1 數列極差

2022-05-05 13:21:12 字數 1013 閱讀 5175

題目傳送門

這題也是典型的貪心演算法題。

對於這個問題 先通過例項來認識問題所描述的計算過程。

令$ n=3 $ ,取數列 $ 3,5,7 $

可能有下面三種情況

$ (3×5+1)×7+1=113 $

$ (3×7+1)×5+1=111 $

$ (5×7+1)×3+1=109 $

由此可見先運算小資料的到的是最大值,先運算大資料得到的是最小值。

故針對此問題可採用貪心演算法,下面驗證其合理性:

不妨假設 $ 3 $ 個數 $ a$ 1.(a×b+1)×c+1= abc + c + 1 $

$ 2.(a×c+1)×b+1= abc + b + 1 $

$ 3.(b×c+1)×a+1= abd + a + 1 $

顯然,選擇兩個較小數能得到最大的結果,而選擇兩個較大的數能得到最小的結果,上述演算法的正確性得證。推廣至n個數,該演算法的單調性也顯而易見。

#include #define _for(i,a,n) for(int i=a;i>t;while(t--)

#define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

typedef long long ll;

typedef pairp;

const int maxn = 5e4;

priority_queue, greater> q1;

priority_queue, less> q2;

int main()

cin >> t;

int maxv = 0, minv = 0;

while(q1.size() != 1)

cout << q1.top() - q2.top() << endl;

return 0;

}

C 一本通 1 1 練習 1 數列極差

一本通題庫 1427 libreoj 10005 vjudge 注意 一本通題庫和libreoj題意相同,但輸入格式不同。以一本通題庫為準。在黑板上寫了n nn個正整數作成的乙個數列,進行如下操作 每一次擦去其中的兩個數a aa和b bb,然後在數列中加入乙個數a b 1 a b 1 a b 1,如...

一本通 1 1 練習 2 數列分段

題目link 首先對於乙個序列,從 a 1 l 都符合最佳序列,假設對於第 l 1 個數,它放到從 l 1 r 的區間是一種最優的方法,並且它也可以放在從 1 l 1 這裡,那麼根據貪心,它放到 1 l 1 的序列中是合法的,而且也是一種最優方案。因此,這道題只需要貪心 能將當前數往左放就往左放。1...

貪心 一本通 1 1 練習 2 數列分段

雖然題目標註的是貪心,但是,我覺得,用動態規劃可能會更簡單一點。令dp i 代表從1開始到第i個結束最少要分成的段數。n 5,m 6。a陣列下標 dp陣列41 1221 4325 4315 3ans dp n 3 如果sum a i m,則dp i sp i 1 sum a i 否則,dp i dp...