hdu 3183 A Magic Lamp (rmq)

 2023-12-07 阅读 23 评论 0

摘要:?題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> /** rmq 問題:題意很簡單,求一行數字中除去其中m個數字,使其組成最小的

?題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3183

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/**
rmq 問題:題意很簡單,求一行數字中除去其中m個數字,使其組成最小的一個數字
使用rmq解題,設源數字長為n,那么除去m個數字后剩下的還剩n-m個數字,組成最小的數字。
(1)因為剩下n-m個數字,那么在1到m+1位置中最小的那個數字必是結果中的第一個數字i,
(2)然后從這個數字i位置的下個位置i+1開始到m+2位置的數字中最小的那個數字必定是
結果中第二個數字,以此類推下去向后找。
(3)為了保證數字最小所以要保證高位最小還要保證數字長度夠用~~
**/
char num[1010];
char res[1020];
int dp_min[1010][20];
int t;//返回較小值
int mins(int a,int b)
{return num[a]<=num[b]?a:b;
}
void rmq_init(int len)
{for(int i = 0; i < len; i++)dp_min[i][0] = i;for(int j = 1; (1<<j) < len; j++)for(int i = 0; i+(1<<j)-1 < len;i++)dp_min[i][j] = mins(dp_min[i][j-1],dp_min[i+(1<<(j-1))][j-1]);
}int query(int l,int r)
{int k = (int)(log((double)(r-l+1))/log(2.0));return mins(dp_min[l][k],dp_min[r-(1<<k)+1][k]);
}int main()
{int len;while(scanf("%s%d",num,&t)!=EOF){len = strlen(num);rmq_init(len);int m = len-t;int p = 0,j=0;while(m--){p=query(p,len-m-1);res[j++] = num[p++];}for(p = 0; p < j; p++)if(res[p]!='0')break;if(p==j)printf("0");else{while(p<j)printf("%c",res[p++]);}puts("");}return 0;
}

?

轉載于:https://www.cnblogs.com/newpanderking/archive/2012/12/27/2836351.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/193054.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息