Trang chủ Tin Học Lớp 8 Python/C++/Java Dùng đệ quy để làm (bắt buộc). *Làm dễ...

Python/C++/Java Dùng đệ quy để làm (bắt buộc). *Làm dễ hiểu tí nha ._. $\\$ Dữ liệu vào: standard input Dữ liệu ra: standard output Giới hạn thời gian: 1.0 giâ

Câu hỏi :

Python/C++/Java Dùng đệ quy để làm (bắt buộc). *Làm dễ hiểu tí nha ._. $\\$ Dữ liệu vào: standard input Dữ liệu ra: standard output Giới hạn thời gian: 1.0 giây Giới hạn bộ nhớ: 128 megabyte Cho hai số nguyên dương x, y, ta xây dựng số z bằng cách ghép các chữ số của x và y sao cho thứ tự các chữ số của x và y vẫn giữ nguyên trên z. Tìm giá trị bé nhất và lớn nhất của z. Dữ liệu vào: - Một dòng gồm 2 số nguyên dương x, y (1 $\le$ X, Y $\le$ $10^{9}$) Dữ liệu ra: - Dòng thứ nhất ghi giá trị bé nhất của z và dòng thứ hai ghi giá trị lớn nhất của z Ví dụ input 13 26 output 1236 2613

Lời giải 1 :

Hơi dài do nó là đệ quy (dùng while sẽ dễ)

/* _user_Capricoder_ */
// to daoanhviet2009
#include <bits/stdc++.h>
using namespace std;
string x, y, smin, smax;
void dequymin(int i, int j)
{
 if (i == x.size())
 {
  while (j < y.size())
  {
   smin += y[j];
   ++j;
  }
  return;
 }
 if (j == y.size())
 {
  while (i < x.size())
  {
   smin += x[i];
   ++i;
  }
  return;
 }
 smin += min(y[j], x[i]);
 if (x[i] < y[j]) ++i;
 else ++j;
 dequymin(i, j);
}
void dequymax(int i, int j)
{
 if (i == x.size())
 {
  while (j < y.size())
  {
   smax += y[j];
   ++j;
  }
  return;
 }
 if (j == y.size())
 {
  while (i < x.size())
  {
   smax += x[i];
   ++i;
  }
  return;
 }
 smax += max(y[j], x[i]);
 if (x[i] > y[j]) ++i;
 else ++j;
 dequymax(i, j);
}
int main()
{
 ios::sync_with_stdio(0);
 cout << "Nhap x: "; cin >> x;
 cout << "Nhap y: "; cin >> y;
 dequymin(0, 0);
 dequymax(0, 0);
 cout << smin << '\n' << smax;
 return 0;
}

image

Thảo luận

-- Wrong Answer on test 4 :)
-- nhập 34 với 43 nó ra 4334 là max :)
-- 4334 thì nó đúng mà nhỉ ?
-- 4343 mới đúng 4 - 34 - 3

Lời giải 2 :

#include <bits/stdc++.h>

using namespace std;

string a, b;

int max_length, m, n;

int current_a = 0;

int current_b = 0;

string current_result;

// Set lưu các kết quả liệt kê

unordered_set<long long> results;

void add() {

    // Nếu độ dài xâu kết quả mà thoả mãn bằng độ dài của A và B cộng lại thì thêm và results

    results.insert(stoll(current_result)); // stoll là hàm chuyển string sang long long

}

// Hàm quay lui dùng để liệt kê

void backtrack(int i) {

    for (int j = 1; j <= 2; j++) {

        // Nếu j = 1 thì đến chữ số thứ 1 chọn A

        // = 2 thì chọn B

        if (j == 1) {

            // Tăng vị trí ở string A lên một đơn vị (giống kiểu chuyển đến index tiếp theo)

            current_a++;

            // Nếu vẫn chưa vượt quá độ dài A

            if (current_a > m) { current_a--; continue; }

            else { current_result[i] = a[current_a]; }

        }

        else {

            // Tăng vị trí ở string B lên một đơn vị (giống kiểu chuyển đến index tiếp theo)

            current_b++;

            // Nếu vẫn chưa vượt quá độ dài B

            if (current_b > n) { current_b--; continue; }

            else { current_result[i] = b[current_b]; }

        }

        

        if (i == max_length) {

            // Nếu i == max_length thì thêm xâu kq vào results

            add();

        }

        else {

            // Nếu chưa thì tiếp tục đệ quy tìm số kế tiếp thêm vào current_result

            backtrack(i+1);

        }

        

        // Trả lại biến A và B về như ban đầu

        if (j == 1) { current_a--; }

        else        { current_b--; }

    }

}

int main() {

#ifndef ONLINE_JUDGE

    freopen("input.txt", "r", stdin);

    freopen("output.txt", "w", stdout);

#endif

    // Thay vì dùng int, ta sử dụng string để dễ dàng truy cập vào hàng đơn vị, hàng chục, hàng trăm, ...

    cin >> a >> b;

    m = (int)a.size(); n = (int)b.size();

    // Max length là độ dài lớn nhất khi ghép A và B

    max_length = m + n;

    for (int i = 0; i <= max_length; i++) current_result += "0";

    // Thêm dấu cách để string bắt đầu từ 1

    a = " " + a;

    b = " " + b;

    // Dùng backtrack (quay lui) để sinh mọi trường hợp có thể xảy ra

    backtrack(1); // String bắt đầu từ 1

    

    long long min_ = 1e18 * 2;

    for (auto x : results) min_ = min(x, min_);

    long long max_ = -1e18 * 2;

    for (auto x : results) max_ = max(x, max_);

    

    cout << min_ << "\n" << max_ << "\n";

    

    return 0;

}

image

Bạn có biết?

Tin học, tiếng Anh: informatics, tiếng Pháp: informatique, là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng (ảo). Với cách hiểu hiện nay, tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin.

Nguồn : Wikipedia - Bách khoa toàn thư

Tâm sự 8

Lớp 8 - Năm thứ ba ở cấp trung học cơ sở, học tập bắt đầu nặng dần, sang năm lại là năm cuối cấp áp lực lớn dần nhưng các em vẫn phải chú ý sức khỏe nhé!

Nguồn : ADMIN :))

Liên hệ hợp tác hoặc quảng cáo: gmail

Điều khoản dịch vụ

Copyright © 2021 HOCTAPSGK