(中石油八)问题 M: X的难题(贪心)

问题 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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值