【题解】删数问题(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++] != '\0');
    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几乎一样的题

猜你喜欢

转载自www.cnblogs.com/ZhengkunJia/p/12319762.html