在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出R*C个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少
采用二分+贪心策略
我们将r*c个数排序,显然,最优情况每一行必然是序列中一段连续的数字
二分可以接受的最大法值
那么判定合法的段数有没有r段即可
#include#include using namespace std;int s[500010],R,c,n;bool ok(int x){ int t=0; for(int i=0;i<=n-c;++i) if(s[i+c-1]-s[i]<=x){ i+=c-1; t++; } return t>=R;}int main(){ scanf("%d%d%d",&n,&R,&c); for(int i=0;i >1; if(ok(m)) r=m; else l=m+1; } printf("%d\n",l);}