刪數問題(Noip1994)--貪心

【題目描述】
輸入一個高精度的正整數n,去掉其中任意s個數字後剩下的數字按原左右次序組成一個新的正整數。編程對給定的n和s,尋找一種方案使得剩下的數字組成的新數最小。

輸出新的正整數。(n不超過240位)

輸入數據均不需判錯。

【輸入】
n

s


【輸出】
最後剩下的最小數。

【輸入樣例】
175438
4
【輸出樣例】
13

 要考慮怎麼刪數是最小,這裏的想法就是貪心;c++

從高位到低位看,若是高位大於低位,那麼刪掉高位的數:175438,1<7,無論;7>5,刪掉7;15438,5>4,刪5;編程

高位數越大,這個數就越大,因此咱們要從高位來看,高位和下一位比較;spa

若是是遞增的數,那麼就刪最後一位;位數變少,數字也會比刪其餘的要少;例如:123456;code

#include <bits/stdc++.h>

using namespace std;


int main()
{
    string a;
    int n,i,j,k;
    cin>>a>>n;
    int len=a.size();
    for(k=0;k<n;k++)   //這個循環控制刪數的次數
    {
        for(i=0;i<len-1;i++)    //這個循環比較此位和下一位的大小
        {
            if(a[i]>a[i+1])    //刪數
            {
                for(j=i;j<len-1;j++)
                    a[j]=a[j+1];
                break;  //刪完數後,應該跳出循環,進行下一次找數刪數(break不能跳出if);n次刪數;
            }
        }
        len--;    //若是不知足條件 (都是遞增的數),那麼長度直接減1;適用於123456這種狀況;其實無論滿不知足比較的條件,長度都會減1
    }

    i=0;
    while(i<=len-1&&a[i]=='0')
        i++;
if(i==len) cout<<"0"<<endl; else for(j=i;j<=len-1;j++) cout<<a[j]; return 0; }
相關文章
相關標籤/搜索