ZR954 分組(排序 dp)

2021-10-03 00:19:16 字數 2163 閱讀 2599

共有 n

nn 人報名了招聘,第 i

ii 個人的工作經驗為 w

iw_i

wi​,薪水為 s

is_i

si​。要招聘 2×k

2 \times k

2×k 個人,並將這些人分為 k

kk 組,每組兩個人。乙個人為組長,而另乙個人為組員。對於每個組,要求組長的工作經驗不小於組員的工作經驗。

每個應聘者會有乙個意願 p

ip_i

pi​,表示他應聘的崗位。若 pi=

1p_i = 1

pi​=

1,則應聘的是組長;若 pi=

2p_i = 2

pi​=

2,則他應聘的是組員;若 pi=

3p_i = 3

pi​=

3,則他既可以當組長又可以當組員。

求在不改變意願的情況下,是否可以招聘滿足條件的 2×k

2 \times k

2×k 個人。如果可以,還要求招聘的人薪水和的最小值。

1 ≤n

×k≤1

05,1

≤wi≤

10

91 \leq n \times k \leq 10^5, 1 \leq w_i \leq 10^9

1≤n×k≤

105,

1≤wi

​≤10

9。盡量讓組員在組長的前面,所以先根據經驗排序,如果經驗相同,讓志願為組員的在前面,都可以在中間,志願為組長的在後面。

令 f i,

a,bf_

fi,a,b

​ 為排序後前 i

ii 個人,有 a

aa 個組長和 b

bb 個組員的最小代價。對於每個人,根據他的志願,如果是組長就分進乙個只有組員的組,如果是組員就新開乙個組,兩個都可以就都試一試。

在分好組及其之前,因為排序了,所以不可能有組長的人數比組員多。

發現三維 dp 會 mle,用滾動陣列。還要開 long long。

這樣寫複雜度為 o(n

k2

)o(nk^2)

o(nk2)

,會 tle。可以特判 2×k

>

n2 \times k > n

2×k>

n 的無解情況。複雜度 o(n

k)

o(nk)

o(nk)。

#include

using

namespace std;

#define re register

#define f first

#define s second

typedef

long

long ll;

typedef pair<

int,

int> p;

const

int n =

1e5+5;

const

int inf =

0x3f3f3f3f

;int

read()

int n, k;

struct persona[n]

;bool

cmp(person a, person b)

ll f[2]

[5005][

5005];

intmain()

for(

int i =

1; i <= n; i++

)sort

(a +

1, a + n +

1, cmp)

;memset

(f,0x7f

,sizeof

(f))

; f[0]

[0][

0]=0

;int now =0;

for(

int i =

1; i <= n; i++)}

if(f[n &1]

[k][k]

==9187201950435737471

)puts

("-1");

else

printf

("%lld\n"

, f[n &1]

[k][k]);

return0;

}

ZR954 分組(排序 dp)

共有 n nn 人報名了招聘,第 i ii 個人的工作經驗為 w iw i wi 薪水為 s is i si 要招聘 2 k 2 times k 2 k 個人,並將這些人分為 k kk 組,每組兩個人。乙個人為組長,而另乙個人為組員。對於每個組,要求組長的工作經驗不小於組員的工作經驗。每個應聘者會有...

GridControl詳解(四)分組排序彙總

分組 按時間分第一組 按性別分第二組 顯示結果 高階設定 將所有組展開 gridview1.expandallgroups 顯示結果 自定義組名,gridview級事件 增加事件 private void gridview1 customdrawgrouprow object sender,deve...

SQL(1)分組排序返回序號

select a.name,b.name,a.salary,row number over partition by b.name order by a.salary as rn from a left join b on a.id b.aid 解析 row number over partitio...