问题 M: X的难题
题目描述
这天,M国的一个小农奴主X又在为难农奴们了,他把他家每一条耗牛背上都写上了一个个位数字(0–9),然后把任意一些牛排在一起,这样就组成了一个多位数字。
现在他为难大家的难题是,对于牛组成的这个多位数字,他每次会扔出几颗石头,扔出几颗石头就表示需要农奴们从那排牛中赶走多少头牛,这样剩下的牛不改变顺序又组成了一个新的数字,他的要求是,这个新的数字必须要最小。
如果大家完成不了他的难题,那么每个农奴都要挨打,要知道他打人可是出了名的,不知道有多少个农奴被他打死了。
你能帮助那些农奴们吗?请编写一个程序完成这项任务,然后夺下农奴主手里的皮鞭。
输入
N I (N是由牛背上的数字排成的多位数,已经牛的数量最少为2,最多为100,I表示扔出的石头的数量,即要从牛中赶走I头牛)
输出
S (赶走I头牛后剩下的牛组成的数字,要求这个新的数字最小)
样例输入 Copy
1432 2
样例输出 Copy
12
思路:
如果没有0,那直接找最大的数逐个去除,对吗?
当然不对,位数小的数字再大,也不如位数大的一个0;如1429去一个,142>129。
那数中有零怎么办?。。。
我一开始做的思路就比较复杂,没找到可以贪心的规律,分类死了。
不说了,直接上规律:从高位开始,(假如a[j]表示现在这一位数),a[j]>a[j+1],去掉a[j],如果一直到最后,去最后一位。最后处理一下前导零就可以了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=110;
int main(){
char arr[MAXN];
int n;
cin>>arr>>n;
int len=strlen(arr);
//贪心
for(int count=0;count<n;count++){
for(int i=0;i<len-1;i++)
if(arr[i]>arr[i+1]){
for(int j=i;j<len-1;j++)
arr[j]=arr[j+1]; //这里的去除方法是移位
break;
}
len--; //间接的可以去除最后一位
}
int begin=0,cnt=len;
while(arr[begin]=='0'&&cnt>1){ //处理前导零
begin++;
cnt--; //至少有一位
}
for(int i=begin;i<len;i++){
cout<<arr[i];
}
return 0;
}