南陽理工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;
}