時間限制:
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...