Giải quyết bài toán ghép số để được số lớn nhất như thế nào?

Hi dũng.
Cho các số 1, 3, 5, 7, 8, 9 viết số lơn nhất có 6 chữ số. @_@!

Hi dũng.
Bài mày hay vậy sao lại xóa đi thế bạn ?

  1. Chiều dài số ghép được là không đổi nên một số đứng trước đứng sau phụ thuộc vào chữ số đầu tiên của nó. Vậy nên ta luôn có 9xxx9xxxx9xx98xxx8xxxxx87xxxx7x7xxx7777xxx v.v.v.

P/S Đang nghĩ tiếp. ANh em có ý tường gì không ?

đọc vào dạng chữ rồi sắp xếp lớn tới bé rồi in ra ko có dấu cách ~.~

[“123”, “124”, “56”, “90”] -> [“90”, “56”, “124”, “123”] -> 9056124123

1 Like

Hi xn–tr-oja.
Vậy bộ test này [“8”, “89”, “87”] đâu xếp được ?? -> 89, 8, 87

2 Likes

vậy thì khi so sánh phải append thêm số đầu tiên vào cho bằng độ dài hết 8, 89, 87 -> 88, 89, 87 -> 89 88 87 -> 89 8 87

hên xui

vẫn còn vấn đề, ví dụ 43 < 434, nhưng 46 > 464 =), vậy với tie breaker xyzax và xyzbx là a < b, thôi cũng khó quá =)

edit: double độ dài là ổn:
vd:
43 434 46 464 46472 4647

max len = 5 -> chuyển thành chuỗi độ dài 10:
4343434343(43)
4344344344(434)
4646464646(46)
4644644644(464)
4647246472(46472)
4647464746(4647)

sort từ lớn tới bé:
4647464746(4647)
4647246472(46472)
4644644644(46)
4644644644(464)
4344344344(434)
4343434343(43)

1 Like

Hi xn–tr-oja.
Mình thấy ý tướng append là hợp lý.
Trường hợp chứ số đầu giống nhau là X ta so sánh chữ số thứ 2 Y nếu Y > X -> XYX > XXY vậy các số có chữ số thứ 2 lớn hơn số đầu xếp trước. Tường tự nếu Y < X thì xếp sau. Vấn đề nếu là XX và X khi só sánh chữ số thứ 3 với X là được.

1 Like

có thể tạo 1 cái operator< theo kiểu a < b nếu ab < ba

8 < 89 nếu 889 < 898 (đúng) -> 89 sẽ đứng trước 8
8 < 87 nếu 887 < 878 (sai) -> 8 đứng trước 87

ko biết cái này với append cái nào lẹ hơn =)

edit: cái append là suy nghĩ theo lối mòn, cái a < b nếu ab < ba có lẽ đúng hơn

viết code cũng dễ hơn cái append kia nữa

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main()
{
    std::vector<std::string> p;
    for (std::string s; std::cin >> s; p.push_back(s));
    std::sort(begin(p), end(p), [](auto const& a, auto const& b){
        return a+b > b+a;
    });
    for (auto const& s : p) std::cout << s;
}
3 Likes

Hi xn–tr-oja.
Theo mình thì dùng toán tử và chạy hàm xắp xếp có vẻ nhanh hơn vì thự tế append vào sẽ thừa.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?