【题目描述】
有编号为1至n的n个同学一起去探险,现在把他们分成k个小组,每个小组完成一项探险任务。分组时,如果第i人与第j人分在同一组(i < j),则他们之间的所有人(第i+1,i+2,…,j-1个)也必须在同一个小组中。
一个小组内所有人的体力和越小,途中可能越危险。为了确保每个同学的安全,要求分组时,使得所有小组中,体力和最小的那个小组的所有人的体力和尽量大。
依次告诉你每个人的体力,如何分组呢?
【题解】
首先这个题CodeVS没有给数据范围,我查了一下,才知道是1≤n≤30000,1≤k≤1000, k≤n,每个人的体力值不大于10000。
这个题的意思是,要你在所有可能的分法中找出一种情况,使得最弱的那个组的体力和最大。很显然,我们是希望我们求的答案在这一组最小的情况下最大,如果我们枚举答案的话,这个答案应该是从大到小的,而枚举的思路就让我们想到了用二分答案。
想到了二分就要想怎么写check。很显然,我们想让其他的分组在每个组都大于枚举的那个答案的情况下还要满足分成k组的情况。这个是比较好写的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using nam