时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:430

解决:76

题目描述:
众所周知JOBDU旗下的JOBCOLA公司是文明全球的著名可乐制造商,与其它可乐公司不同的是,JOBCOLA可乐公司并不是以其可乐的味道闻名,而是以其不同寻常的包装瓶被消费者所津津乐道。在JOBCOLA可乐公司成立100周年的日子里,公司搜集了历年来生产的可乐瓶,想通过举办一个可乐瓶展览,以此来提高公司的文化品位。但是受制于展览场地的大小,只能展出一部分的瓶子。经过JOBDU董事会与展览承办商协商之后,决定选出一个连续时期的瓶子用于展览,同时为了达到最佳的美学感受,在所展览的瓶子中,最高的瓶子和最低的瓶子之间的高度,不能超过k。
给你的任务就是,挑选出满足上述要求的最长瓶子序列,供董事会选择。
输入:
每个测试案例包括两行:
第一行为两个整数,n和k,其中n代表待选的瓶子个数,k为所选出的瓶子中最高瓶子和最低瓶子之间的最大落差。其中1 <= n <= 105, 0 <= k <= 106
第二行包含n个整数,每个整数代表瓶子的高度(单位为微米),已知所有瓶子都已经按照生产年代,从古到今进行了排序。
输出:
对应每个测试案例,输出的第一行包括两个整数a, b。其中a代表满足条件的瓶子个数;b则代表有多少组这样的选择方案。接下来再输出b行,每行包括两个整数s, e (1 <=s,e <=n),其中s代表所选的a个瓶子中最古老的瓶子的下标,而e则代表该方案中最近生产的瓶子下标。注意:若有多个方案,则按照s从小到大的顺序输出;若s相同,则按照e的大小输出。
样例输入:
3 2
13 12 10
样例输出:
2 2
1 2
2 3

思路:

其实我没AC,思路还是有问题。以后找时间再AC。先贴别人的代码。

代码:

//ac code

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std; int height[100009];
int n, k;
int h[100009][20];
int l[100009][20];
int exp2(unsigned x);
int getmax(int x, int y);
int getmin(int x, int y);
int Ok(int len);
int rx[100000];
int ry[100000];
int main(){
while(cin>>n>>k){
for(int i= 0; i< n; ++i){
scanf("%d", height+i);
}
for(int i= 0; i< n; ++i){
h[i][0]= i;
l[i][0]= i;
}
int x= exp2(n);
//RMQ
for(int j= 1; j<= x; ++j){
for(int i= 0; i<= n-(1<<j); ++i){
h[i][j]= h[i][j-1];
l[i][j]= l[i][j-1];
if(height[h[i][j]]< height[h[i+(1<<(j-1))][j-1]]){
h[i][j]= h[i+(1<<(j-1))][j-1];
}
if(height[l[i][j]]>= height[l[i+(1<<(j-1))][j-1]]){
l[i][j]= l[i+(1<<(j-1))][j-1];
}
}
}
int low= 1, high= n;
int mid;
//binary search最大值
while(low< high){
mid= (low+high)>>1;
if(Ok(mid)){
low= mid+1;
}else{
high= mid-1;
}
}
while(!Ok(low))
--low;
int a, b;
int count= 0;
for(int i= 0; i<= n-low; ++i){
a= getmax(i, i+low-1);
b= getmin(i, i+low-1);
if((height[a]-height[b])<= k){
rx[count]=i;
ry[count]=i+low-1;
++count;
}
}
cout<<low<<' '<<count<<endl;
for(int i= 0; i< count; ++i){
cout<<rx[i]+1<<' '<<ry[i]+1<<endl;
}
}
} int exp2(unsigned x){
int re= 0;
while(x){
x>>=1;
++re;
}
return re-1;
} int getmax(int x, int y){
int p= exp2(y-x+1);
if(height[h[x][p]]>= height[h[y-(1<<p)+1][p]]){
return h[x][p];
}else{
return h[y-(1<<p)+1][p];
}
}
int getmin(int x, int y){
int p= exp2(y-x+1);
if(height[l[x][p]]< height[l[y-(1<<p)+1][p]]){
return l[x][p];
}else{
return l[y-(1<<p)+1][p];
}
} int Ok(int len){
for(int i= 0; i<= n-len; ++i){
if(height[getmax(i,i+len-1)]-height[getmin(i,i+len-1)]<= k){
return true;
}
}
return false;
}

九度OJ 1344:可乐瓶展览 (DP)的更多相关文章

  1. 九度OJ 1082:代理服务器 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...

  2. 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...

  3. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  4. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  5. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. 【九度OJ】题目1475:IP数据包解析 解题报告

    [九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...

  7. 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告

    [九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...

  8. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  9. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

随机推荐

  1. zabbix自定义触发器

    zabbix中监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值,每一个触发器 ...

  2. SSO单点登录系列4:cas-server登录页面自定义修改过程(jsp页面修改)

    落雨 cas 单点登录 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一 ...

  3. Linux中MySQL数据库max_allowed_packet的调整

    在MySQL数据库里某表有一个blob字段,当上传文件超过1M的时候出现下面的错误: PreparedStatementCallback; SQL [insert into uos.docfile(r ...

  4. 如何安装Android SDK Emulator

    1 下载并安装JDK,可以到官方网站寻找自己的对应版本下载 http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u1-downlo ...

  5. JQuery修改对象的属性值

    JQuery修改对象的属性值 用到的便是JQuery提供的attr方法,获取属性值的基本结构为:$(obj).attr("属性名"):修改属性值的结构为:$(obj).attr(& ...

  6. vuejs 表单验证插件 VeeValidate

    VeeValidate https://baianat.github.io/vee-validate/

  7. Archlinux: 优化触摸板配置

    在逛 Archlinuxcn BBS 时看到这个帖子: fcitx 输入法看不到选词,上面键盘也不见了! 等待妹子的 依云 提到了 infinality, 并且给出了这个链接: fix-infinal ...

  8. 【Excle数据透视表】如何利用图标集将销售数据划分为五个等级

    我们如何用图标集来直观看出订单情况呢? 现在有数据如下: 步骤 选中"订单列"→开始→条件格式→图标集→等级→ 此时,在每个数字前面都出现了一个等级符号了 查看预置五等级图标集的规 ...

  9. 【Excle】使用&拼接,拼接后复制到文本编辑器存在引号(“”)问题

    1.错误的操作 如下图:拼接 拼接后,复制到文本编辑器: 1.1错误原因 出现上述问题的原因:是由于在拼接字符串的时候, INSERT INTO CST(ID,NAME)values( 上述这段字符& ...

  10. Vue-cli + Express 构建的SPA Blog(前后分离)

    代码地址如下:http://www.demodashi.com/demo/12526.html 为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVV ...