标签:book 开头 最小 ace using code 区间 strlen cpp
这么简单的贪心题我竟然交了5遍。
先说一下题解的思路:
每一次都删第一个递减区间的首字符,如果没有递减区间就删最后一个。
自己的思路:
枚举在开头删几个元素,比较删除后首位的值,去一个最小的,把它前面的都删掉(相当于先保证首位最小)。然后再去递归解决子问题,同样的方法,只是能删的数减少了,起始位置向后了。
上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 50005;
int n,k;
char a[N];
bool book[N];
void delet(int t,int l)
{
if(l<=0) return ;
if(t>n) return;
int minn=9,id=0;
for(int i=t;i<=t+l;i++)
if(a[i]-'0'<minn)
minn=a[i]-'0',id=i;
for(int i=t;i<id;i++)
book[i]=1,--l;
if(n-id+1<=l)
{
int tmp=n;
while(l>=1)
{
if(!book[tmp]) book[tmp]=1,--l;
--tmp;
}
return ;
}
delet(id+1,l);
}
int main()
{
scanf("%s%d",a+1,&k);
n=strlen(a+1);
delet(1,k);
int at=1;
bool flag=0;
while(a[at]=='0'||book[at]) ++at;
for(int i=at;i<=n;i++)
if(!book[i]) putchar(a[i]),flag=1;
if(!flag) putchar('0');
putchar('\n');
return 0;
}
标签:book 开头 最小 ace using code 区间 strlen cpp
原文地址:https://www.cnblogs.com/karryW/p/11617936.html