zoukankan      html  css  js  c++  java
  • hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标

    /*
    hdu3183
    终点 
    给一个整数,可以删除m位,留下的数字形成一个新的整数 
    rmq
    取n-m个数,使形成的数最小
    */
    #include<iostream>
    #include<cstring>
    #include<cmath> 
    #include<cstdio>
    #define MAXN 1010
    using namespace std;
    int dp[MAXN][20];
    int a[MAXN];
    void makeRMQ(int n,int b[]){//在i到1<<j区间内的最小值的下标 
        for(int i=0;i<n;i++)
            dp[i][0]=i;//区间长度等于0时 
        for(int j=1;(1<<j)-1<n;j++)
            for(int i=0;i+(1<<j)-1<n;i++)
                if(b[dp[i][j-1]]<=b[dp[i+(1<<j-1)][j-1]])
                //这里一定要加等号,就是相等的时候取下标小的 
                    dp[i][j]=dp[i][j-1];
                else
                    dp[i][j]=dp[i+(1<<j-1)][j-1]; 
    }
    int rmqIndex(int s,int v,int b[]){//在区间s->v之间找区间最小值,
                                        //加等号,取小标小的 
        //1<<k+1的长度必须覆盖[s,v]    
        int k=(int)(log(v-s+1.0)/log(2.0));//k就是那个区间[s,v]长度的log2 
        if (b[dp[s][k]]<=b[dp[v-(1<<k)+1][k]])
            return dp[s][k];
        else
            return dp[v-(1<<k)+1][k]; 
    } 
    char str[MAXN];
    int ans[MAXN]; 
    int main(){
        int m;
        while(scanf("%s%d",&str,&m)!=EOF){
            int n=strlen(str);
            for(int i=0;i<n;i++)
                a[i]=str[i]-'0';
            makeRMQ(n,a);
            int t=0;
            int temp=0;//temp最后=n-m 
            //找n-m个数,每次从[t,i]中找到最小的 
            for(int i=m;i<n;i++){
                t=rmqIndex(t,i,a);
                ans[temp++]=a[t++];
            }
            t=0;
            while(t<temp&&ans[t]==0)
                t++;//=滤掉高位的0! 
            if(t>=temp)
                printf("0
    ");
            else{
                for(int i=t;i<temp;i++)    
                    printf("%d",ans[i]);
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Navicat Premium_11.2.7简体中文版 破解版本 windows版本 失效
    php多维数组排序 3
    php 多维数组排序
    php对二维数组排序
    mysql子查询批量找id最大的
    教你如何选择相机的曝光模式(转)
    3分钟搞懂曝光直方图(转)
    摄影新手最想知道的10件事(转)
    教你搞懂光圈大小的成像差异(转)
    新手必须掌握的20个摄影构图法 转
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10056850.html
Copyright © 2011-2022 走看看