[삭제] 문제의 해결 몇 가지 질문 (Noip1994)

이름

시간 제한 : 1000 MS 메모리 제한 : 65,536킬로바이트의
제출 : 11506 수에 의하여 : 3852

설명 [TITLE]

새로운 S 자리 양의 정수에 대한 후 나머지 디지털 원래 순서를 제거 고정밀 양의 정수 n을 입력. 최소 새 번호의 숫자를 나머지 있도록 주어진 N과 S의 프로그래밍하는 솔루션을 찾을 수 있습니다.

새로운 출력 양의 정수. (N은 240보다 더하지이다)

입력 데이터는 잘못된 판결하지 않고 있습니다.

[Enter]를

에스

[출력]

마지막 남은 최소 번호.

[샘플 입력]

175,438
4

[샘플 출력]

(13)

분석

말을 많이하지, 그것은 감소하는 시퀀스의 첫 번째 요소를 삭제하는 것입니다

테스트 케이스는 상대적으로 물이 여기에 주로 몇 가지 특별한 문장에 대해 이야기입니다 :

1. 선도 제로
같은 2. 샘플 :
1444 3 삭제
서면 두 가지 방법이 있습니다, 그리고 마침내 1444 삭제 아무런 관련이없는, 또는, 루프 길이 정수를 축소하지 않을 경우이 엄격하게 순서를 감소되지 않는다

암호

#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;
}

거의 같은 문제 ybt입니다 1231 새로운 작은 정수,

추천

출처www.cnblogs.com/ZhengkunJia/p/12319762.html