关闭

九度OJ 1344:可乐瓶展览 (DP)

标签: 九度OJc语言DP
489人阅读 评论(0) 收藏 举报
分类:

时间限制: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;
}


0
0
查看评论

【杭电oj】1495 - 非常可乐(bfs,队列)

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9317  &#...
  • wyg1997
  • wyg1997
  • 2016-03-28 23:34
  • 557

九度OJ 1205 N阶楼梯上楼问题 (DP)

题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2817 解决:1073 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(要求采用非递归) 输入: 输入包括...
  • wdkirchhoff
  • wdkirchhoff
  • 2014-12-23 12:06
  • 2256

问题描述:一次买n瓶可乐,k个空瓶可以换一瓶饮料,那么一共能喝多少瓶饮料?

/** *问题描述:一次买n瓶可乐,k个空瓶可以换一瓶饮料,那么一共能喝多少瓶饮料? *下面用不同的方法实现了这个问题(Java实现): *1.递归方法 *2.非递归方法 *3.公式法 */ public class CocaCola { public int Count(int n, int k...
  • partynew
  • partynew
  • 2012-11-09 22:29
  • 2392

买可乐的编程问题 2种方法实现

package com.heima.array; public class MyDemo { public static void main(String[] args) { /*、28人买可乐喝,3个可乐瓶盖可以换一瓶可乐, 那么要买多少瓶可乐,够28人喝?   ...
  • qq_32048567
  • qq_32048567
  • 2017-04-25 20:08
  • 241

一瓶可乐一块钱,三个空瓶子可以换一瓶可乐,如果现在有m块钱,能换多少瓶可乐。

问题描述:一瓶可乐一块钱,三个空瓶子可以换一瓶可乐,如果现在有m块钱,能换多少瓶可乐。 代码:  1 #include   2 using namespace std;   3   4 int DrinkNum(int m)   5 {...
  • onelight1997
  • onelight1997
  • 2012-10-12 19:10
  • 3022

上帝扔下的可乐瓶

加米·尤伊斯导演的片子《天主也猖狂》中有这么一个情节。一个飞翔员把一个可乐瓶从飞机上扔下来,被一个从未接触过古代文明的土著部落人捡到。部落的人发现,这个瓶子太神奇了,能吹出奇异的声响,能用来印织物图案,还可以用来磨蛇皮、捣碎食物。总之,这个神奇的可乐瓶无所不克不及。他们以为,这是天主赐赉他...
  • m_mm122
  • m_mm122
  • 2016-10-15 21:36
  • 104

九度OJ学习笔记 题目1023

#include #include #include using namespace std; struct student{ char num[7]; char name[9]; int score; }buf[100001]; bool cmp1(student a,student b){...
  • RQ_Wang
  • RQ_Wang
  • 2017-02-12 12:41
  • 353

java:50瓶可乐,每喝三瓶给你一瓶,请问最后喝了多少瓶.

package jihuoma; //50瓶可乐,每喝三瓶给你一瓶,请问最后喝了多少瓶. public class Test1 { public static void main(String[] args) { int count=50;//统计喝了多少瓶,初值50瓶 int sum=5...
  • u012110719
  • u012110719
  • 2015-01-13 19:44
  • 1337

喝可乐问题,2个空瓶换一瓶可乐

商店里可乐一元一瓶,两个空瓶可以换一瓶可乐,有20元,问可以喝到多少可乐 方法一:一次性把可乐喝完,然后拿瓶去换,换完再喝。。。。(兑换剩余的瓶子要收集一下) int colaNum = 20;// 最初的可乐数量 int bootleNum = 0;// 空瓶子的数量 int ...
  • onepiece2345
  • onepiece2345
  • 2012-11-09 16:06
  • 2165

九度OJ的使用

1.网址:ac.jobdu.com 2.如果以前是王道论坛的用户,直接输入那个账号和密码就行。   如果不是的话,可以在首页新注册一个。 3.做题:在首页上方第二栏“在线练习”中点击“题库”,题目列表就出来了。 4.题目的大体框架: (1)题目描述:会有一些小故...
  • sunwl_csdn
  • sunwl_csdn
  • 2016-07-13 22:27
  • 1181