题目描述

在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出R*C个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。

输入

输入共两行。

第一行是三个整数:n,r,c。

第二行是 n 个整数 Pi。

输出

输出一个整数,即满足条件的最小的法值。

样例输入

7 2 3

170 205 225 190 260 225 160

样例输出

30

数据范围

30%:1<=n,r,c<=100

50%:1<=n,r,c<=1000

100%:1<=r,c<=10^4,r*c<=n<=5*10^5,0

解法

考虑矩阵中的两行a和b,a1<a2<...<aC,b1<b2<...<bC,如果aC>b1,那么交换aC和b1可以得到更优的答案。

所以每一行的值域是不会有交集的。


将所有数升序排序。

设已知答案为ans;

顺序枚举每一个数,如果a[i+C−1]−a[i]<=ans,我们就可以贪心地把这C个数放进矩阵,枚举完后判断一下是否能够凑齐R行。

证明:

设选取a[i+k]..a[i+k+C-1]会比选取a[i]..a[i+C-1]更优。

设f(x)为[x..n]的最大答案。

那么选取a[i+k]..a[i+k+C-1]能够得到的最大答案即为f(i+k+C)+1;

选取a[i+k]..a[i+C-1]能够得到的最大答案即为f(i+C)+1;

显然f(x)是减函数。

所以与假设违背。


二分答案ans。

就可以将原问题转化为上述问题。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="aP1.in";
const char* fout="aP1y.out";
const int inf=0x7fffffff;
const int maxn=500007;
int n,m1,m2,i,j,k,tmp,ans,cnt,tmd,l,r,mid;
int a[maxn];
bool judge(int limit){
int i,j,k;
cnt=0;
for (j=1;j<=n-m2+1;j++){
if (a[j+m2-1]-a[j]<=limit){
cnt++;
j=j+m2-1;
if (cnt>=m1) return true;
}
}
return false;
}
int main(){
scanf("%d%d%d",&n,&m1,&m2);
for (i=1;i<=n;i++) scanf("%d",&a[i]),r=max(r,a[i]);
sort(a+1,a+n+1);
l=0;
while (l<r){
mid=(l+r)/2;
if (judge(mid)) r=mid;
else l=mid+1;
}
printf("%d",l);
return 0;
}

启发

最值套最值可以考虑二分。

【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题的更多相关文章

  1. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

  2. 【JZOJ4791】【NOIP2016提高A组模拟9.21】矩阵

    题目描述 在麦克雷的面前出现了一个有n*m个格子的矩阵,每个格子用"."或"#"表示,"."表示这个格子可以放东西,"#" ...

  3. 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除

    题目描述 麦克雷有一个1~n的排列,他想知道对于一些区间,有多少对区间内的数(x,y),满足x能被y整除. 输入 第一行包含2个正整数n,m.表示有n个数,m个询问. 接下来一行包含n个正整数,表示麦 ...

  4. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

  5. 【NOIP2016提高A组模拟9.17】数格子

    题目 分析 设表示每一行的状态,用一个4位的二进制来表示,当前这一行中的每一个位数对下一位有没有影响. 设\(f_{i,s}\)表示,做完了的i行,其状态为s,的方案数. 两个状态之间是否可以转移就留 ...

  6. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  7. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  8. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  9. 【JZOJ4711】【NOIP2016提高A组模拟8.17】Binary

    题目描述 输入 输出 样例输入 6 6 8 9 1 13 9 3 1 4 5 2 6 9 1 3 7 2 7 7 1 6 1 2 11 13 样例输出 45 19 21 数据范围 解法 40%暴力即可 ...

随机推荐

  1. C++与Matlab混合编程之:矩阵数据结构

    项目需要将matlab代码写成C++,准备用opencv.opencv中矩阵的存储与matlab有所不同,应注意以下问题: 1.matlab中矩阵是按照列优先存储的.对于n0*n1*...*nn维的矩 ...

  2. 在 Angularjs 中$state.go 如何传递参数

    在目标页面规定接受的参数: .state('app.AttendanceEditFixed', { url: '/AttendanceEditFixed', params: {'id': null,' ...

  3. python图像翻转

    准备跟着台湾的一个机器学习课程好好学学python,链接在这http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html 该课程开始有一个作业,叫做HW0 ...

  4. 学习mysql数据库

    1.数据库是怎么回事 数据库是存储数据的永久空间,通过一种特殊的方式存储到硬盘中 数据库分为关系型数据库和非关系型数据库 mysql查看数据的方式为:结构化查询语言(SQL语句) 访问mysql数据库 ...

  5. [转载] DSP6000图像位移与变形典型算法

    原文地址:转载:DSP6000图像位移与变形典型算法作者:Jane 李现路:DSP6000图像位移与变形典型算法 一.图像的平移算法 图像平移的数学表达式原理: 初始坐标为(x0,y0)的点经过平移( ...

  6. jQuery 取值、赋值的基本方法整理

    /*获得TEXT.AREATEXT的值*/ var textval = $("#text_id").attr("value"); //或者 var textva ...

  7. ECMAScript 6 (浅显入门)

    1.let:ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为unde ...

  8. 记一次PHP 数组基本用法

    以前不知道PHP数组可以这样叠加. $b = array( '2' => 'zhang', ); $a = array( ' => 'li' ) + $b; print_r($a); $b ...

  9. JQuery或JS判断浏览器内核版本号以及是否支持W3C盒子模型

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support .在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  10. Google自带截图工具的使用

    转载自:http://chromecj.com/utilities/2017-12/859.html