zzuli-2259 matrix
题目描述
在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。
输入
输入共两行。
第一行是三个整数:n,r,c。(r, c <= 104, r * c <= n <= 106)
第二行是 n 个整数 Pi。(0 < pi <= 109)
输出
输出一个整数,即满足条件的最小的法值。
样例输入
7 2 3 170 205 225 190 260 225 160
样例输出
30
可以说是最大值最小化的模板题了,但是比赛的时候没写对。
赛后想了想还是对这类题理解不深。
二分枚举答案,只要找出满足答案的一种情况就行,不需要硬找出最佳的满足情况。所以这题里面直接for循环就好,不需要搜出所有r个的c的情况。
附ac代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6; 4 const int inf = 0x3f3f3f3f; 5 int nu[maxn]; 6 int dis[maxn]; 7 int n, r, c; 8 int fun(int minn) 9 { 10 int rr = 0; 11 int i = c; 12 while(i <= n) 13 { 14 if(dis[i] <= minn) 15 { 16 ++rr; 17 if(rr == r) return 1; 18 i += c; 19 } 20 else ++i; 21 } 22 return 0; 23 } 24 int main() { 25 26 scanf("%d %d %d", &n, &r, &c); 27 for(int i = 1; i <= n; ++i) 28 { 29 scanf("%d", &nu[i]); 30 } 31 sort(nu + 1, nu + 1 + n); 32 for(int i = c; i <= n; ++i) 33 { 34 dis[i] = nu[i] - nu[i - c + 1]; 35 // printf("%d ", dis[i]); 36 } 37 int lt = 0, rt = inf; 38 while(lt <= rt) 39 { 40 int mid = lt + (rt - lt) / 2; 41 // printf("%d\n", mid); 42 if(fun(mid)) rt = mid - 1; 43 else lt = mid + 1; 44 } 45 printf("%d\n", lt); 46 return 0; 47 }