1. 程式人生 > >ACM,再見!

ACM,再見!

給定n位正整數a,去掉其中任意k≤n 個數字後,剩下的數字按原次序排列組成一個新的正整數。對於給定的n位正整數a 和正整數k,設計一個演算法找出剩下數字組成的新數最小的刪數方案。

演算法的原理應該是說從最高位開始,一次向低位搜尋,一旦遇到前一位(高位)的數大於當前位,則刪去前一位,直到刪除k個數,如果到達末尾還沒有刪除k個,則說明現在這個數已經是從小到大排序了,則從最低位開始刪除要求的位數。

程式碼1:

#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
    string a;
    int n;
    while(cin >> a >> n)
    {
        int m=a.size();
        for(int j=0; j<n; j++)
        {
            int flag=0;
            for(int i=0; i<m; i++)
                if(a[i]>a[i+1])
                {
                    a.erase(a.begin()+i);
                    flag=1;
                    break;
                }
            if(!flag)
               a.erase(a.end()-j,a.end());
        }
        cout << a<< endl;
    }
    return 0;
}

程式碼2:
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int main()
{
    char a[105];
    int n;
    while(cin >> a >> n)
    {
        int m=strlen(a);
        while(n--)
        {
            int i=0;
            while(i<m-1&&a[i]<=a[i+1])
            {
                i++;
            }
            if(i==m-1)
            {
                m--;
                while(n--)
                   m--;
                break;
            }
            else
            {
                for(int j=i;j<m-1;j++)
                    a[j]=a[j+1];
                m--;
            }
        }
        for(int i=0;i<m;i++)
          printf("%c",a[i]);
        cout << endl;
    }
    return 0;
}