删数问题(贪心)

描述

输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。

输出新的正整数,若输出前有0则舍去。(n不超过240位)

输入数据均不需判错。

格式

输入格式

n 和 s

输出格式

一个正整数,即最少需要的组数。

样例

输入样例

175438
4

输出样例

13

限制

时间限制: 1000 ms

内存限制: 65536 KB

一开始没有看清楚和理解 “去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数” 这句话的意思,直接惯性思维进行排序,结果肯定WA。贪心思路:从左往右删,前者比后者大,那么就删除前者,比如:n=100534 s=2,过程是1比0大,删除1,5比3大,删除5结果是0034,将多余的00去掉,然后的结果34。

#include <iostream>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
	int a[245], count=0, s, leng;
	string ss;
	memset(a, -1, sizeof(a));
	getline(cin, ss);
	scanf ("%d", &s);
	for (int i=0; i<ss.length(); i++) {
		a[i] = ss[i] - '0';
	}
	leng = ss.length();
	for (int i=0; i<s; i++) {                //循环s遍
		for (int j=0; j<leng-1; j++) {
			if (a[j] > a[j+1]) {
				for (int k=j; k<leng-1; k++) {    //删除
					a[k] = a[k+1];
				}
				break;
			}
		}
	leng--;
	}
	for (int i=0; i<leng && a[i]==0; i++) {    //记录多余0的数目
			count++;
	}
	if (count == leng) {                    //全为0时
		printf ("0");
	} else {
		for (int i=count; i<leng; i++) {
			printf ("%d", a[i]);
		}
	}
	return 0;
}
发布了89 篇原创文章 · 获赞 77 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wodemaoheise/article/details/104925401