码迷,mamicode.com
首页 > 其他好文 > 详细

zzuli-2259 matrix

时间:2018-04-22 00:04:10      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:sed   任务   pre   c++   ++   \n   none   最小化   src   

题目描述

在麦克雷的面前有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 }
View Code

 

zzuli-2259 matrix

标签:sed   任务   pre   c++   ++   \n   none   最小化   src   

原文地址:https://www.cnblogs.com/zmin/p/8904346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!