AT_abc374_c [ABC374C] Separated Lunch 题解

辛姜_千尘红回 2024-10-10 08:35:02 阅读 61

题目传送门

右侧可以传送到原题位置。

题目大意

题目描述

由于 KEYENCE 总部的员工越来越多,他们决定将总部各部门分成两组,错开午休时间。

KEYENCE 总部有

N

N

N 个部门,第

i

i

i 个部门

(

1

i

N

)

(1\leq i\leq N)

(1≤i≤N) 的人数为

K

i

K_i

Ki​ 。

将每个部门分配到

A

A

A 组或

B

B

B 组,让每个组里面的所有人在同一时间午休,并确保

A

A

A 组和

B

B

B 组的午休时间不重叠,求同一时间午休的最大人数的最小值。

换句话说,求分配给

A

A

A 组的部门总人数和分配给

B

B

B 组的部门总人数中较大者的最小值。

数据范围

2

N

20

2 \leq N \leq 20

2≤N≤20。

1

K

i

1

0

8

1 \leq K_i \leq 10^8

1≤Ki​≤108。所有输入值均为整数。

解题思路

注意到数据范围比较小,可以考虑爆搜。

对于每个部门的人数

K

i

K_i

Ki​,由于这

K

i

K_i

Ki​ 个人只能同时在 A 组或者同时在 B 组,所以每个部门都只有两种决策:

将所有人划分在 A 组中。将所有人划分在 B 组中。

因此,我们使用 dfs 进行枚举,分别考虑第

i

i

i 个部门划分在 A 组与 B 组的情况。记

P

A

,

P

B

P_A,P_B

PA​,PB​ 分别为 A 组人数与 B 组人数,那么

a

n

s

=

max

{

a

n

s

,

min

{

P

A

,

P

B

}

}

ans = \max\{ans,\min\{P_A,P_B\}\}

ans=max{ -- -->ans,min{ PA​,PB​}},其中

a

n

s

ans

ans 代表答案。

算法总时间复杂度为

O

(

2

n

)

\mathcal{O}(2^n)

O(2n)。

CODE:

<code>#include <bits/stdc++.h>

using namespace std;

#define int long long

int k[30], ans = 1e18, n;

inline void dfs(int step, int P_A, int P_B) { -- --> //正在遍历部门 step,A 组人数为 P_A,B 组人数为 P_B

if (step == n + 1) {

ans = min(ans, max(P_A, P_B));

return;

}

dfs(step + 1, P_A + k[step], P_B);

dfs(step + 1, P_A, P_B + k[step]);

}

signed main() {

ios::sync_with_stdio(false);

ios_base::sync_with_stdio(false);

cin.tie(0), cout.tie(0);

cin >> n;

for (int i = 1; i <= n; i++)

cin >> k[i];

dfs(1, 0, 0);

cout << ans;

return 0;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。