• 【题解】删数问题(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几乎一样的题

  • 相关阅读:
    SSAS 内部错误:操作未能成功
    无法从项目中获取SSIS包的列表
    新特技软件(Analyzer)添加新用户
    cmd命令搜集
    面试中--js注意事项(小知识点)
    面试的一般需求
    函数----let和const
    函数----箭头函数
    vuex的相关知识
    js中,数组去重的方法的总结(温故而知新)
  • 原文地址:https://www.cnblogs.com/ZhengkunJia/p/12319762.html
Copyright © 2020-2023  润新知