集合删数
描述:
一个集合有如下元素:1 是集合元素;若 P 是集合的元素,则 2 * P +1,4*P+5 也是集
合的元素,取出此集合中最小的 K 个元素,按从小到大的顺序组合成一个多位数,现要求
从中删除 M 个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。
注:不存在所有数被删除的情况`
输入格式:
输入的仅一行,K,M 的值,K,M 均小于等于 30000。
输出格式:
输出为两行,第一行为删除前的数字,第二行为删除后的数字。
样例输入:
5 4
样例输出:
137915
95
program number; (** Prob=number Date=2012/10/17 Author=HT **) Const maxn=4232447; Var ct,i,n,k,m,j,q,ct9,maxi,max9:longint; v:array[0..maxn] of boolean; a,pre,next:array[0..30001] of longint; f:ansistring; s:string; Procedure fopen; begin assign(input,'number.in'); assign(output,'number.out'); reset(input); rewrite(output); end; Procedure fclose; begin close(input); close(output); end; Procedure print; var i:longint; begin writeln(f); fclose; halt; end; begin fopen; fillchar(v,sizeof(v),false); v[1]:=true; for i:=1 to maxn do if v[i] then begin if 2*i+1<=maxn then v[2*i+1]:=true; if 4*i+5<=maxn then v[4*i+5]:=true; end; f:=''; ct:=0; for i:=1 to maxn do if v[i] then begin inc(ct); a[ct]:=i; end; readln(k,m); for i:=1 to k do begin str(a[i],s); f:=f+s; end; writeln(f); if m=0 then print; ct9:=0; maxi:=0; max9:=0; for i:=1 to length(f) do if f[i]='9' then begin inc(ct9); if i-ct9<=m then begin maxi:=i; max9:=ct9; end; end; for i:=1 to max9 do write('9'); delete(f,1,maxi); q:=m-maxi+max9; ct:=0; f:=f+':'; repeat dec(q); i:=1; while f[i]>=f[i+1] do inc(i); delete(f,i,1); until q=0; delete(f,length(f),1); writeln(f); fclose; end.