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

2021-10-04 20:42:04 字數 3065 閱讀 3783

一本通題庫-1427

libreoj-10005

vjudge

注意:一本通題庫和libreoj題意相同,但輸入格式不同。**以一本通題庫為準。

在黑板上寫了n

nn個正整數作成的乙個數列,進行如下操作:每一次擦去其中的兩個數a

aa和b

bb,然後在數列中加入乙個數a×b

+1

a×b+1

a×b+

1,如此下去直至黑板上剩下乙個數,在所有按這種操作方式最後得到的數中,最大的max

maxma

x,最小的為min

minmi

n,則該數列的極差定義為m=m

ax−m

in

m=max−min

m=max−

min。

第一行,乙個數為nnn;

第二行,n

nn個數。

輸出極差。

3

1 2 3

2
對於全部資料,0≤n

≤50000

0\le n\le 50000

0≤n≤50

000,保證所有資料計算均在 32

3232

位有符號整數範圍內。

貪心。求max:每次選取兩個最小的數。

求min:每次選取兩個最大的數。

#pragma gcc optimize(3,"ofast","inline")

#pragma g++ optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#define ri register int

#define re(i,a,b) for(ri i=a; i<=b; i++)

#define ms(i,a) memset(a,i,sizeof(a))

#define max(a,b) (((a)>(b)) ? (a):(b))

#define min(a,b) (((a)<(b)) ? (a):(b))

using

namespace std;

typedef

long

long ll;

intconst n=

5e4+5;

int n;

int a[n]

,b[n]

;int

cmp(

int a,

int b)

intmain()

int amax=b[n]

;int ans=amax-amin;

printf

("%d\n"

,ans)

;return0;

}

貪心。

我們可以巧妙利用c++ stl裡面的greater和less,以及priority_queue。

對於greater()、less()兩個函式:

建堆的時候,預設是大根堆,第三個引數用greater()會變成小根堆。less()反之。

排序的時候,預設是從小到大,但是第三個引數用greater()會變成從大到小。less()反之。

用優先佇列代替陣列。

兩種方法的時間複雜度是相似的。

#pragma gcc optimize(3,"ofast","inline")

#pragma g++ optimize(3,"ofast","inline")

#include

#include

#include

#include

#include

#include

#include

#define ri register int

#define re(i,a,b) for(ri i=a; i<=b; i++)

#define ms(i,a) memset(a,i,sizeof(a))

#define max(a,b) (((a)>(b)) ? (a):(b))

#define min(a,b) (((a)<(b)) ? (a):(b))

using

namespace std;

typedef

long

long ll;

int n;

priority_queue<

int,vector<

int>

,greater<

int>

> q1;

priority_queue<

int,vector<

int>

,less<

int>

> q2;

intmain()

int amax=0;

while

(!q1.

empty()

)int x=q1.

top(

); q1.

pop();

int y=q1.

top(

); q1.

pop();

q1.push

(x*y+1)

;}int amin=0;

while

(!q2.

empty()

)int x=q2.

top(

); q2.

pop();

int y=q2.

top(

); q2.

pop();

q2.push

(x*y+1)

;}int ans=amax-amin;

printf

("%d\n"

,ans)

;return0;

}

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

題目傳送門 這題也是典型的貪心演算法題。對於這個問題 先通過例項來認識問題所描述的計算過程。令 n 3 取數列 3,5,7 可能有下面三種情況 3 5 1 7 1 113 3 7 1 5 1 111 5 7 1 3 1 109 由此可見先運算小資料的到的是最大值,先運算大資料得到的是最小值。故針對此...

一本通 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...