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