九度OJ 1344:可乐瓶展览 (DP)
时间限制: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)的更多相关文章
- 九度OJ 1082:代理服务器 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 【九度OJ】题目1475:IP数据包解析 解题报告
[九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...
- 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告
[九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
随机推荐
- Java 中 ConcurrentHashMap 原理分析
一.Java并发基础 当一个对象或变量可以被多个线程共享的时候,就有可能使得程序的逻辑出现问题. 在一个对象中有一个变量i=0,有两个线程A,B都想对i加1,这个时候便有问题显现出来,关键就是对i加1 ...
- 【Hadoop】Hadoop DataNode节点超时时间设置
hadoop datanode节点超时时间设置 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间 ...
- Nginx include和Nginx指令的使用
Nginx include和Nginx指令的使用 1.nginx include 主配置文件nginx.conf中指定包含其他扩展配置文件,从而简化nginx主配置文件,实现多个站点功能 [root@ ...
- hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作
Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...
- Windows虚拟内存如何设置
当我们在运行一些大型的软件,或者是刚刚退出游戏的时候经常会提示"你的虚拟内存过低"的提示,出现这种情况一般是:一:你的物理内存比较小,运行大的软件比较吃力:二:你运行了许多窗口或者 ...
- STL学习笔记(仿函数)
仿函数(Functors) 仿函数(functor),就是使一个类的使用看上去象一个函数.其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了. 例如我们定义一个 ...
- 正则表达式Pattern ,Matcher
正则表达式:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号来表示一些代码的操作,这样就简化代码的书写 学习正则表达式就是要学习一些特殊符号的使用 好处:简化对字符串复杂的操作 ...
- 转python调用Go代码
Go 1.5发布了,其中包含了一个特性:可以编译生成动态链接库,经试验,生成的.so文件可以被python加载并调用.下面举个例子: 先写一个go文件main.go: package main imp ...
- [redis]redis概述
Redis是一个开源.支持网络.基于内存.可持久化的日志型.key-value键值对数据库.使用ANSI C编写.并提供多种语言的API. 它是远程字典server(remote dictionary ...
- java之Cookie具体解释
Cookie是由server端生成.发送给User-Agent(通常是浏览器).浏览器会将Cookie的key/value保存到某个文件夹下的文本文件内.下次请求同一站点时就发送该Cookie给ser ...