1. 程式人生 > >南陽理工acm 448尋找最大數(簡單貪心)

南陽理工acm 448尋找最大數(簡單貪心)

尋找最大數

時間限制:1000 ms  |  記憶體限制:65535 KB 難度:2
描述

請在整數 n 中刪除m個數字, 使得餘下的數字按原次序組成的新數最大,

比如當n=92081346718538,m=10時,則新的最大數是9888

輸入
第一行輸入一個正整數T,表示有T組測試資料
每組測試資料佔一行,每行有兩個數n,m(n可能是一個很大的整數,但其位數不超過100位,並且保證資料首位非0,m小於整數n的位數)
輸出
每組測試資料的輸出佔一行,輸出剩餘的數字按原次序組成的最大新數
樣例輸入
2
92081346718538 10
1008908 5
樣例輸出
9888
98
來源
上傳者

想法:

首先我們要真確理解題意:請在整數 n 中刪除m個數字, 使得餘下的數字按原次序組成的新數最大,

刪除這m個數,不是意味從位數上為0開始刪除m個位數再輸出就行。例如:8890刪除一位數,是890而不是889.

可以知道新組成的這個數的位數=n的位數—m。(注第一位為數值最高位)

那麼我們首先要找到組成這個最大數的第一位的數值,那則是從第一位到第m位中最大的,(假設最大為第n位)

組成這個最大數的第二位的數值,則是從第n位到第m+1位中最大的。

核心程式碼:

while(m<len)
        {
            char ws='0';
            for(i=m;i>flag;i--)
            {
                if(a[i]>=ws)
                {
                    ws=a[i];
                    count=i;
                }
            }
            m++;
            flag=count;
            printf("%d",ws-'0');
        }

程式碼:

#include<stdio.h>
#include<string.h>
char a[110];
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        memset(a,0,sizeof(a));
        int m,i;
        scanf("%s%d",a,&m);
        int count=-1;
        int flag=-1;
        int len=strlen(a);
        while(m<len)
        {
            char ws='0';
            for(i=m;i>flag;i--)
            {
                if(a[i]>=ws)
                {
                    ws=a[i];
                    count=i;
                }
            }
            m++;
            flag=count;
            printf("%d",ws-'0');
        }
        printf("\n");
    }
    return 0;
}