貪心 NYOJ448 尋找最大數

2021-07-11 01:29:33 字數 1411 閱讀 8333

時間限制:

1000

ms  | 

記憶體限制:

65535kb

難度:2 描述

請在整數

n 中刪除

m個數字

,使得餘下的數字按原次序組成的新數最大,

比如當n=92081346718538

,m=10

時,則新的最大數是

9888

輸入

第一行輸入乙個正整數

t,表示有

t組測試資料

每組測試資料佔一行,每行有兩個數

n,m(

n可能是乙個很大的整數,但其位數不超過

100位,並且保證資料首位非0,

m小於整數

n的位數)

輸出

每組測試資料的輸出佔一行,輸出剩餘的數字按原次序組成的最大新數

樣例輸入

2
92081346718538 10
1008908 5

樣例輸出

9888
98

思路:這道題可以理解為:在字串中找出乙個由strlen(str)-m個字元按順序(不要求連續)拼成的最大數。

其實這是個不斷貪心的過程,首先要在str[0]到str[m](包括str[m])找到第乙個最大的數字

(注意哦,是第乙個最大數字)作為最高位數(之所以要在0到m間找,

是因為至少要留出strlen(str)-m-1位放在最高位後面的低位),假設是str[k],

然後再從str[k+1]到str[m+1](因為此時已經選了1個,所以留出至少strlen(str)-m-2位放在第二位位後面的低位)

找到第乙個最大的作為第二位數……一直到strlen(str)-m個數被確定完,

這樣從最高位到最低位都是所能選擇的最大值,所以得到的結果也將是最大值。

#include

#include

using namespace std;

int main() , pos1 = 0, pos2 = m;

while(pos2 < len) {

int max = 0;

for(int i = pos1; i <= pos2; i++) {

if(str[i] > max) {

max = str[i];

pos1 = i+1;

pos[j] = str[pos1-1];

j++;

pos2++;

for(int i = 0; i < len-m; i++)

cout << char(pos[i]);

cout << endl;

NYOJ448 尋找最大數(貪心)

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n...

nyoj448尋找最大數

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n...

NYOJ 448 尋找最大數

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 請在整數 n 中刪除m個數字,使得餘下的數字按原次序組成的新數最大,比如當n 92081346718538,m 10時,則新的最大數是9888 輸入 第一行輸入乙個正整數t,表示有t組測試資料 每組測試資料佔一行,每行有兩個數n...