链接:删数问题 - 洛谷
算法思路:鸽巢定理+贪心
实现:正向如果要看删除谁的话不好判断,但我们可以保留最小的值。
先确定保留数的区间,由鸽巢定理我们可以确定出肯定会有数出现的区间,再利用循环找出最小值,更新左右区间,左区间更新到这一次位子的下一个位子(题意要求这个数必定是这个数以后的),右区间利用鸽巢确定。
注意这题的坑是前导零,把前导零删除就行了,如果最后除了前导零没其他数的话输出零就行了。
代码:
#include <iostream>
using namespace std;
int flag,mark;
string s;
int find_min(int l,int r){
char minn=s[l];
mark=l+1;
for(int i=mark;i<=r;i++){
if(s[i]<minn){
minn=s[i];
mark=i+1;
}
}
return minn-'0';
}
int main(){
cin>>s;
int k;
cin>>k;
for(int i=0;i<s.size()-k;i++){//新位数
int x = find_min(mark,k+i);
if(flag==0 && x==0) continue;
flag=1;
cout<<x;
}
if(flag==0) cout<<"0";
return 0;
}