刪數問題(Noip1994)--貪心


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

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

輸入數據均不需判錯。

【輸入】
n

s


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

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

 要考慮怎么刪數是最小,這里的想法就是貪心;

從高位到低位看,如果高位大於低位,那么刪掉高位的數:175438,1<7,不管;7>5,刪掉7;15438,5>4,刪5;

高位數越大,這個數就越大,所以我們要從高位來看,高位和下一位比較;

如果是遞增的數,那么就刪最后一位;位數變少,數字也會比刪其他的要少;例如:123456;

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM