P4447 AHOI2018初中組 分組(貪心

2021-10-07 11:54:36 字數 1525 閱讀 8021

傳送門

思路:貪心。將陣列從小到大排好序後,用優先佇列維護每個組的當前最大實力值和人數,按照實力值為第一關鍵字,人數為第二關鍵字排序。

討論一下:

因為我們是按實力值從小到大排序的,所以不會出現a[i

]<

a[i]<

a[i]

<

隊首實力值的情況。

1.若a[i

]a[i]

a[i]

不等於當前隊首實力值+1+1

+1,則該組不會再發生變化,答案取最值,彈出。

2.若隊列為空或者當前隊首實力值=a[

i]

=a[i]

=a[i

],則建立以a[i

]a[i]

a[i]

乙個新組。

3.滿足a[i

]=

a[i]=

a[i]

=隊首實力值+1+1

+1,更新該組實力值和人數。

最後所有組人數取最值即可。

時間複雜度:o(n

logn

+2n)

o(nlogn+2n)

o(nlog

n+2n

)

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e5+

5,m=

1e6+

5,inf=

0x3f3f3f3f

,mod=

1e9+7;

#define mst(a) memset(a,0,sizeof a)

#define lx x<<1

#define rx x<<1|1

#define reg register

#define pii pair

#define fi first

#define se second

int n,a[n]

,ans=

1e9;

priority_queueq;

intmain()

if(q.

empty()

||q.

top(

).fi==

-a[i]))

;continue;}

pii now=q.

top(

);q.

pop();

now.fi--

,now.se--

; q.

push

(now);}

while

(!q.

empty()

) ans=

min(ans,

-q.top()

.se)

,q.pop()

;printf

("%d\n"

,ans)

;return0;

}

P4447 AHOI2018初中組 分組 貪心

p4447 ahoi2018初中組 分組 首先想到對資料進行某種排序後順序處理,sort 因此是公升序 就可以了.一開始看到演算法標籤裡有個佇列就開了優先佇列,後來發現沒必要而且讓 看起來很複雜 最初想到的處理方式是遍歷公升序排序後的每個資料,對於每個資料遍歷所有隊伍 用二維陣列儲存所有隊伍的所有成...

洛谷 P4447 AHOI2018初中組 分組

題目 總共有n個隊員,每個人都有乙個實力值a i 把n個隊員分成若干個小組。要求分成的每個小組的隊員實力值連續,同時,乙個隊不需要兩個實力相同的選手。給出乙個合法的分組方案,滿足所有人都恰好分到乙個小組。使得人數最少的組人數最多,輸出人數最少的組人數的最大值。注意 實力值可能是負數,分組的數量沒有限...

洛谷 P4447 AHOI2018初中組 分組

題目 一開始沒讀懂題,直接排序 模擬找最短長度,像 6 1 2 3 1 2 3這組資料這種查詢方法結果是1,正解是3 include include include include include include include include using namespace std typedef...