【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题
题目描述
在麦克雷的面前有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】选数问题的更多相关文章
- [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)
题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...
- 【JZOJ4791】【NOIP2016提高A组模拟9.21】矩阵
题目描述 在麦克雷的面前出现了一个有n*m个格子的矩阵,每个格子用"."或"#"表示,"."表示这个格子可以放东西,"#" ...
- 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除
题目描述 麦克雷有一个1~n的排列,他想知道对于一些区间,有多少对区间内的数(x,y),满足x能被y整除. 输入 第一行包含2个正整数n,m.表示有n个数,m个询问. 接下来一行包含n个正整数,表示麦 ...
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...
- 【NOIP2016提高A组模拟9.17】数格子
题目 分析 设表示每一行的状态,用一个4位的二进制来表示,当前这一行中的每一个位数对下一位有没有影响. 设\(f_{i,s}\)表示,做完了的i行,其状态为s,的方案数. 两个状态之间是否可以转移就留 ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- 【NOIP2016提高A组模拟9.24】总结
第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...
- 【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%暴力即可 ...
随机推荐
- 阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务
1.HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎.Ganos已作为云数据库时空引擎与数据库平台融合,建立了以自研云原生数据库POALRDB为基础,联合NoSQL大数据 ...
- ionic view 视图
ionic view 方法 $ionicView.loaded 视图已经被加载了.这事件只发生一次当视图被创建并添加到Dom中.当跳出页面并且被缓存了的话,再次访问这个页面时这个时间将不会被激活.L ...
- app-safeguard-record:record
ylbtech-work-app-safeguard-record:record 1.返回顶部 1. 示数 示数一般是指机械.仪器.仪表.或者需要对数字进行公开的显示的对外数字的宣示.比如电度表(千瓦 ...
- Java面试总结-基础篇2
1. mvn的dependency-management dependency-management是声明依赖,不实际引入,主要用于在父依赖中统一各依赖的版本,否则,各个子模块在引用同一依赖时,难免会 ...
- Java面试总结-基础篇1
java多线程-- 自旋锁,偏向锁 好处:可以举Servlet和CGI的对比用户线程和守护线程的区别:用户线程结束后JVM会退出,然后守护线程才会终止(比如垃圾回收线程),如何在java中创建守护线程 ...
- day65-test
目录 一.点击事件控制标签颜色 二.实现点击次数,变换页面标签的颜色 三.周期性实现颜色的旋转变色 练习题 一.点击事件控制标签颜色 1.有 红.黄.蓝 三个按钮,以及一个200x200矩形框box, ...
- 常见问题:MongoDB基础知识
常见问题:MongoDB基础知识 ·MongoDB支持哪些平台? ·MongoDB作为托管服务提供吗? ·集合(collection)与表(table)有何不同? ·如何创建数据库(database) ...
- H5C3--媒体查询(向上兼容,向下覆盖),link中引入的ont and only
一.使用 实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 使用Jedis操作Redis-使用Java语言在客户端操作---对Sorted-Sets的操作
//对Sorted-Sets操作 /** * Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中. * 它们之间的主要差别是Sorted-Sets ...
- mysql 索引优化 性能调优 锁
1 检查mysql 是否安装 rpm -qa|grep -i mysql 2 ntsysv 查看和设置开机启动列表 3 mysql 在 centos 上默认 的数据目录是 /var/lib/mysql ...