【题解】删数问题(Noip1994)

题目

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 11506 通过数: 3852

【题目描述】

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

输出新的正整数。(n不超过240位)

输入数据均不需判错。

【输入】

n

s

【输出】

最后剩下的最小数。

【输入样例】

175438
4

【输出样例】

13

分析

不多说,就是删掉递减序列的第一个元素

测试样例是比较水的,这里主要说一下几个特判:

1.前导零
2.像这样的样例:
1444删3位
这是没有严格递减序列的,如果在循环中不缩减整数长度的话,最后啥也没删,还是1444,所以有两种写法

code

#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(int i=a;i<=b;i++)
#define UF(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;

int n, a[300], s;
string p;
int main()
{
	
		int flag = 0;

		cin >> p;
		n = p.length();
		
			F(i,0,n-1){
				a[i + 1] = p[i] - '0';
				
			}	
		int i = 1;
		while(i <= n){
			if(a[i] == 0){
				a[i] = -1;
				i++;
			}	
			else	break;
		}
		cin >> s;
		int s0 = s;
		while(s0--){
			int i = 1;
			while(i <= n){
				if(a[i] == -1){
					i++;
					continue;
				}	
				int j = i + 1;
				while(a[j] == -1)	j++;
				if(a[i] <= a[j])//是否取等问题,
				//55567 删3; 1444删3 
					i++; 
				else
					break;
			}
			a[i] = -1;
		}
		int shan = 0;
		F(i,1,n){
			if(a[i] == -1)	shan++;
		}
		if(shan < s){//要手动判断一下 
			int end = n;
			for(end;end >= 1; end--){
				if(a[end] != -1){
					a[end] = -1;
					shan ++;
				}
				if(shan == s)
					break;
			}
		}
		i = 1;
		while(i <= n){//删后的前导零和前导-1 
			if(a[i] != -1 && a[i] != 0)		break;
			else	i++;
		}
		while(i <= n){
			if(a[i] != -1){
				flag = 1;
				cout << a[i];
			}		
			i++;
		}
		if(!flag)	cout << 0;
		cout << endl;
	
	return 0;
}

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int s;
int n[100000];
string in;
bool flag;
int strlen(string ff){
    // cout << "func" << endl;
    int tot = 0;
    while(ff[tot++] != '');
    tot--;
    return tot;
}
int t;
int main(){
	
		flag = 0; 
		cin >> in;
	    cin >> s;
	    for(int i = 0;i < strlen(in); i++){
	        n[i] = in[i] - '0';
	    }
	    int len = strlen(in);
	    for(int i = 1;i <= s; i++){
	        for(int j = 0;j < len - 1; j++)
	            if(n[j] > n[j+1]){
	                for(int k = j;k < len-1;k++){
	                    n[k] = n[k+1];
	                }
	                break;
	            }
	        len--;//如果找不到递减序列,就直接删最后一个元素 
	    }
	    for(int i = 0;i < len; i++){
	        if(n[i] != 0) flag = 1;
	        if(flag) cout << n[i];
	    }
	    if(flag)	cout << endl;
	    if(!flag) cout << 0 << endl;
	
    
    return 0;
}


1231 最小新整数 ,这是ybt几乎一样的题

原文地址:https://www.cnblogs.com/ZhengkunJia/p/12319762.html