NYOJ 448 尋找最大數

2021-07-04 15:24:19 字數 1420 閱讀 3988

時間限制:

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

思路:

對這個字串進行查詢,每次查詢最大值,查詢len-m次即可。

但查詢的時候需要考慮查詢範圍,比如9222225,第一次查詢的時候只能查詢9到最後乙個2這個範圍,因為要保持原序列,所以在查詢第i個字元的時候,後面必須還剩下m-i個字元不能查詢,這樣才能保證位數最大,因為不管什麼情況,位數多的數肯定大於位數小的數。

那麼思路就明確了。

迴圈len-m次就可完成任務,每次迴圈都是從查詢到的最大值的下乙個字元開始查詢,範圍必須保證能保證位數不能少於len-m。這樣就ok了。

ac**1:(第一種可能有點複雜,看不明白的們建議看第二種。因為第一種找最大值用的是排序,第二種用的是比較,所以可能第二種更為簡單一些)

#include#include#includeusing namespace std;

struct nodeeg[110];

bool cmp(node a,node b)

int main(){

int t;

char ans[110];

scanf("%d",&t);

while(t--){

int i,m;

char str[110];

memset(ans,0,sizeof(ans));

scanf("%s%d",&str,&m);

int len=strlen(str);

int k=0,key=m,j;

for(i=0;i#includeint main(){

int t;

char ans[110],str[110];

scanf("%d",&t);

while(t--){

int m,k=0,key,i,j;

memset(ans,0,sizeof(ans));

scanf("%s%d",&str,&m);

int len=strlen(str);

key=m;

for(i=0;i

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...

nyoj 448 尋找最大數

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