sgu543 Cafe
题目链接:https://codeforces.com/problemsets/acmsguru/problem/99999/543
题目大意:有 $n$ 个团体,每张桌子有 $r$ 个位置,问最小多少张桌子能让所有人上桌,要求:一个桌子上不会出现一个团体只有一个人在这张桌子上。
做法
注意到一个事情:任何一个 $>1$ 的正整数可以被拆分成若干 $2,3$ 的和,但问题是,我们不知道每个团体的人要被拆成多少个 $2,3$ (显然,知道有多少个 $2,3$ ,就可以在足够优秀的时间复杂度内得到最少的桌子数量)。
但是又注意到一个事情:一个桌子上有两个 $3$ 和一个团体被拆分成两个 $3$ 这两件事不会同时发生,因为发生这种情况时可以交换,然后把两个 $3$ 拆成 $3$ 个 $2$ 。
因此我们只要分成两种情况讨论就行了:
- 每个团体至多拆出一个 $3$ 。
- 每个桌子至多放置一个 $3$ 。
然后讨论一下就做完了,我采用了二分,所以时间复杂度是:$O(n\log{V})$ 的。
1 |
|
还有个问题,如果知道了有多少个 $2,3$ ,可以多快知道有多少个桌子数,显然 $O(\log)$ 可以,但是可以线性吗?
我们不妨设 $f(x)$ 表示有 $x$ 张桌子的情况下,将 $3$ 的桌子放进去,最多还能放入多少的 $2$ ,而 $f$ 显然能写成 $O(1)$ 个分段函数相加,且边界可以在 $O(1)$ 的时间处理完,所以一定可以在 $O(1)$ 的时间解决,具体讨论不再赘述。
因此,每个团队至多一个 $3$ 的情况可以在 $O(1)$ 的时间内解决。
同理,每张桌子至多一个 $3$ 的情况,显然此时可以认为 $r$ 为奇数,$r$ 为偶数的情况这种情况肯定不如另一种情况优。
可以先把原来的团队分成:$0/1$ 个 $3$ ,最多的 $6$ 和剩下的 $2$。
设 $f(x)$ 表示有 $x$ 张桌子的话至多能放多少个人,其中 $x\ge 3$ 的个数,因此 $f(x)$ 关于 $x$ 是偶数和奇数分别是分段函数,因此类似上面的,只要肯讨论,也可以在 $O(1)$ 内解决。
综上,该问题可以在 $O(n)$ 时间内解决。