請在整數 n 中刪除m個數字, 使得余下的數字按原次序組成的新數最大,
比如當n=92081346718538,m=10時,則新的最大數是9888
2 92081346718538 10 1008908 5樣例輸出
9888 98錯誤原因 例14593 3 按照我的程序走是輸出59,可實際上的是93
#include#include char num[110]; int s[12]; int main() { int t,m; int i,j,k; int len; scanf("%d",&t); getchar(); while(t--) { scanf("%s %d",num,&m); getchar(); len=strlen(num); memset(s,0,sizeof(s)); for(i=0;i
解題思路由於只能從給定的數字中刪掉確定數目的數字,每位數字之間不允許交換,所以先考慮最大數字的特點,即盡量讓大數在高位。
給定數字為一個N位數,刪掉其中M位(M<=N),使得到的(N-M)位數的值盡可能大。其實也就是從一個N位數中取出(N-M)個數,使得到的數盡量大。
按照上述的兩個思想,就是說,取每一位數時,從給定數中都要取最大的數。這樣,取數的過程中保證每一位都是最大,這樣結果也必然是最大的。
下面舉例說明:
從source_number:105789中刪去3位數,所得數字放在result_num中。
先從source_number取得result_num的第一位(按從左往右記數)。
數位: 1 2 3 4 5 6
Source_num:1 0 5 7 8 9
第一步:取得7,之後source_num變為89。只能從source_num的前4位(length_source –fetch_num + 1,length_source為源數的長度,fetch_num為取數的個數)中取,這樣不會導致取數之後,剩余的數字不夠取的情況。
第二步:取得8,source_num變為9。
第三步:取得9,結束。
Result_num為:789。
代碼
#include#include char s[110],num[110]; int main() { int t,n; int i,j,k,l,len,a,m; char max; scanf("%d",&t); getchar(); while(t--) { scanf("%s%d",s,&n); len=strlen(s); k=len-n;//要留下的位數 m=len-k+1;//每次截止的地方 l=0; a=0;//每次開始的地方 for(i=0;i