cuốn sách gpt4 ai đã làm

c++ - 计算两个数的超表中的第 N 个数

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 05:03:24 25 4
mua khóa gpt4 Nike

Hai bảng kỹ thuật số Mộtb được viết và hợp nhất với nhau theo thứ tự tăng dần, loại bỏ các nội dung trùng lặp. Vấn đề bây giờ là tìm tỉ số trong bảng siêu này TRÊN) Độ phức tạp tốt hơn thứ n con số.

Giới hạn 

1<=A, B<=1000

1<=N<=1000000000

Đây là cách thực hiện của tôi, nhưng nó làTRÊN), ai có thể đề xuất một thuật toán có độ phức tạp tốt hơn? Cảm ơn!

#include 
#include
using namespace std;

dài dài int phút(dài dài a, dài dài b){
if(a
ngược lại trả về b;
}

long long int get( long long int a, long long int b, long long int count) {
dài dài int val = 0,i;
dài dài int nexta = a;
dài dài int nextb = b;
cho ( i = 0; i < đếm; i++) {
val = phút(nexta, nextb);
nexta = val < nexta ? nexta : (nexta + a);
nextb = val < nextb ? nextb : (nextb + b);
}
trả lại giá trị;
}


int chính() {
int t;
cin >> t;

trong khi(t--){
dài dài int a,b,n;
cin >> a>> b>> n;
cout << get(a,b,n)<< endl;
}
return 0;
}

Ví dụ:A=3, B=5

Bảng A = 3, 6, 9, 12, 15, 18, v.v.

Bảng B=5,10,15,20, v.v.

Sau khi sáp nhập: 3, 5, 6, 9,10, 12,15,15, 18, 20, v.v.

Xóa các bản sao: 3, 5, 6, 9, 10, 12, 15, 18, 20, v.v.

Với N= 2 , phần tử thứ hai của siêu bảng là 5

câu trả lời hay nhất

Nếu tôi đọc chính xác, mảng MỘTB Chỉ định như sau:

A[i] = a*i
B[i] = b*i

Sau đó, bằng cách áp dụng tìm kiếm nhị phân, bạn nhận được ít nhất O(log N) giải pháp.

Hãy xem xét một số giá trị x. Liệu nó có vượt xa lần đầu tiên của bạn không? n yếu tố? Bạn cần phải chắc chắn x Có bao nhiêu phần tử trong dãy hợp trước đó. Điều này được thực hiện dễ dàng: từ MỘT Bắt đầu có x/a phần tử, từ B Bắt đầu có x/b, nhưng rất tiếc - chúng ta đã đếm phần tử chung hai lần rồi. có x/ngày yếu tố công cộng, nơi d Đúng Mộtb Phép nhân chung nhỏ nhất của , vì vậy hãy trừ đix/ngày. Vậy nếux/a + x/b - x/d>=n,那么xÍt nhất là lần đầu tiênnphần tử, nếu không thì nó ở trước.

Bây giờ mã tìm kiếm nhị phân trở thành (mã giả)

l = 0
r=a*n+1
d = lcm(a,b)
whilerl>1
m = (r+l)/2
cnt = m/a + m/b - m/d
nếu cnt >= n
r = m
nếu không thì l = m
câu trả lời của bạn là r

thậm chí có thể O(1) Giải pháp có sẵn

Về c++ - Tính số thứ N trong siêu bảng gồm hai số, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/30352036/

25 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress