额 主要一个记录路径 一个记录正确的值 我觉得前者可能更好 手贱的拿正确值了 然后就没有然后了...(要消除一些值的话 第二种亲测死的很惨QAQ 而且 本弱智商欠费 不支持优化....)
#include<cstdio>
#include<cstring>
#include<cmath>
char s[1010];
char ans[1020];
int st[1010][20];
int Min(int x,int y)//确定位置
{
return s[x] <= s[y] ? x : y;
}
void RMQ_Init(int len)
{
for(int i = 0; i < len; i++)
st[i][0] = i;//pos确定位置
for(int j = 1; (1<<j) < len; j++)
for(int i = 0; i+(1<<j)-1 < len;i++)
st[i][j] = Min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
int Query(int l,int r)
{
int k = (int)(log((double)(r-l+1))/log(2.0));
return Min(st[l][k],st[r-(1<<k)+1][k]);
}
int main()
{
int len, m, i;
while(scanf(" %s%d",s, &m)!=EOF)
{
len = strlen(s);
RMQ_Init(len);
m = len - m;//确定剩余量~~~
int pos = 0, num = 0;
while(m--)
{
pos = Query(pos, len - m - 1);//整段的通过
ans[num++] = s[pos++];
}
for(i = 0; i < num; i++)
if(ans[i]!='0')break;
if(i == num)
printf("0");
else
{
while(i < num)
printf("%c",ans[i++]);
}
printf("\n");
}
return 0;
}
第二种 就是 模板了 有大神要是能帮我优化当然是最好的了~~~~·
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char num[1010];
int dp[1010][1010],ans[1010];
void RMQ_init(int n)
{
int i,j,m,t;
for(i=1;i<=n;i++)dp[i][0]=num[i-1]-'0';
m=(int)(log(1.0*n)/log(2.0));
for(j=1;j<=m;j++){
t=n-(1<<j)+1;
for(i=1;i<=t;i++){
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ_find(int l,int r)
{
int k=(int )(log(1.0*(r-l+1))/log(2.0));
return min(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
int del,len,cur,rep,loc,i;
while(scanf(" %s%d",&num,&del)!=EOF){
len=strlen(num);
RMQ_init(len);
cur=1;
rep=0;
loc=0;
// for(i=1;i<=len;i++)printf("%d ",dp[i][0]);
// printf("\n");
for(i=1;i<=len-del;i++){
cur=RMQ_find(i,i+(del));
// printf("%d ",cur);
ans[loc++]=cur;
}
//printf("\n");
for(loc=0;loc<=len-del;loc++){
if(ans[loc]!=0)break;
}
if(loc==len-del+1)printf("0");
else {
for(;loc<len-del;loc++)printf("%d",ans[loc]);
}
printf("\n");
}
return 0;
}