G
ginofft
Chắc suất Đại học top - Giữ chỗ ngay!! ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.
Em đang học lớp 10, bị thiếu một cột 15', vì một lí do nào đó mà ông thầy đưa em bài trên đội tuyển r kêu em làm lấy điểm .
Đề bài như sau:
Hãng cung cấp dịch vụ điện thoại XYZ khuyến khích nhiều người đăng kí thuê bao bằng cách: Khi khách hàng đến đăng kí thuê bao thì sẽ được cấp hai số may mắn là số nguyên dương n và k, hãng sẽ khuyến mãi người đó một số tiền nhận được từ số n sau khi xóa đúng k chữ số (k nhỏ hơn số chữ số của n).
Hải vừa mới đăng kí thuê bao của hãng và được cung cấp hai số n và k, bạn hãy giúp Hải xóa đi k chữ số của số n để số nhận được là lớn nhất.
Dữ liệu vào file văn bản XOASO.INP:
- Dòng thứ nhất là số n (số chữ số của n ≤ 10^5)
- Dòng thứ hai là số k (k<n)
Kết quả ra file văn bản XOASO.OUT:
- Một dòng duy nhất là số lớn nhất có được sau khi xóa đi k chữ số của n
Vd1:
Xoaso.inp:
58816
2
xoaso.out:
886
Vd2:
Xoaso.inp:
2357111317192329
6
Xoaso.out:
7317192329
//=====================================================
Còn đây là code của em:
const fi='Xoaso.inp';
fo='Xoaso.out';
var n:ansistring;
k:longint;
//=======================================================================
procedure doc;
var f:text;
Begin
assign(f,fi);
reset(f);
readln(f,n);
read(f,k);
close(f);
end;
//=======================================================================
procedure ghi;
var f:Text;
Begin
assign(f,fo);
rewrite(f);
write(f,n);
close(f);
end;
//=======================================================================
procedure solve(d,c,dem:longint);
var i,vt,tam,code,max:longint;
Begin
if dem=0 then ghi else
if (c-d)=dem then
Begin
delete(n,c-dem,dem);
ghi;
end
else
Begin
max:=0;
for i:=d to d+dem do
Begin
val(n,tam,code);
if tam>max then Begin max:=tam;
vt:=i; end;
end;
if vt=d then solve(d+1,c,dem) else
Begin
delete(n,d,vt-d);
dem:=dem-(vt-d);
solve(d+1,c,dem);
end;
end;
end;
//=======================================================================
Begin
doc;
solve(1,length(n),k);
end.
//======================================================
Em nghĩ đây chưa phải là thuật toán tối ưu vì độ phúc tạp là O(10^5^2). Mong mọi người chém code tí để em biết mà sửa cho độ phức tạp giảm xuồng >- .
Đề bài như sau:
Hãng cung cấp dịch vụ điện thoại XYZ khuyến khích nhiều người đăng kí thuê bao bằng cách: Khi khách hàng đến đăng kí thuê bao thì sẽ được cấp hai số may mắn là số nguyên dương n và k, hãng sẽ khuyến mãi người đó một số tiền nhận được từ số n sau khi xóa đúng k chữ số (k nhỏ hơn số chữ số của n).
Hải vừa mới đăng kí thuê bao của hãng và được cung cấp hai số n và k, bạn hãy giúp Hải xóa đi k chữ số của số n để số nhận được là lớn nhất.
Dữ liệu vào file văn bản XOASO.INP:
- Dòng thứ nhất là số n (số chữ số của n ≤ 10^5)
- Dòng thứ hai là số k (k<n)
Kết quả ra file văn bản XOASO.OUT:
- Một dòng duy nhất là số lớn nhất có được sau khi xóa đi k chữ số của n
Vd1:
Xoaso.inp:
58816
2
xoaso.out:
886
Vd2:
Xoaso.inp:
2357111317192329
6
Xoaso.out:
7317192329
//=====================================================
Còn đây là code của em:
const fi='Xoaso.inp';
fo='Xoaso.out';
var n:ansistring;
k:longint;
//=======================================================================
procedure doc;
var f:text;
Begin
assign(f,fi);
reset(f);
readln(f,n);
read(f,k);
close(f);
end;
//=======================================================================
procedure ghi;
var f:Text;
Begin
assign(f,fo);
rewrite(f);
write(f,n);
close(f);
end;
//=======================================================================
procedure solve(d,c,dem:longint);
var i,vt,tam,code,max:longint;
Begin
if dem=0 then ghi else
if (c-d)=dem then
Begin
delete(n,c-dem,dem);
ghi;
end
else
Begin
max:=0;
for i:=d to d+dem do
Begin
val(n,tam,code);
if tam>max then Begin max:=tam;
vt:=i; end;
end;
if vt=d then solve(d+1,c,dem) else
Begin
delete(n,d,vt-d);
dem:=dem-(vt-d);
solve(d+1,c,dem);
end;
end;
end;
//=======================================================================
Begin
doc;
solve(1,length(n),k);
end.
//======================================================
Em nghĩ đây chưa phải là thuật toán tối ưu vì độ phúc tạp là O(10^5^2). Mong mọi người chém code tí để em biết mà sửa cho độ phức tạp giảm xuồng >- .