Tổng số bài gửi : 152 Join date : 23/04/2022 Age : 41 Đến từ : THPT Chuyên Nguyễn Tất Thành - Yên Bái
Tiêu đề: T.18 Dãy con có tích lớn nhất Sun May 15, 2022 9:12 am
T.18 Dãy con có tích lớn nhất Cho N và dãy a1, a2, ..., aN. Hãy tìm dãy con có tích lớn nhất. Dữ liệu: Vào từ tệp PERSEQ.INP gồm Dòng 1: Ghi số nguyên dương N (N <=10^5) Dòng 2: Ghi N số nguyên a[i] (a[i] <= 10^9). Kết quả: Ghi ra tệp PERSEQ.OUT giá trị lớn nhất tìm được. PERSEQ.INP 5 -1 2 -4 -5 3 PERSEQ.OUT 120
vhdlinh
Tổng số bài gửi : 34 Join date : 08/05/2022
Tiêu đề: Re: T.18 Dãy con có tích lớn nhất Tue May 17, 2022 1:22 am
Code:
#include <bits/stdc++.h> #define nmax 10005
using namespace std;
int n; int a[nmax];
void find() { int best = INT_MIN, s = 1; for (int i = 1; i <= n; i++) { s = max(a[i], s * a[i]); best = max(best, s); } cout << best << "\n"; }
int main() { ios_base::sync_with_stdio(0); cin.tie(0); freopen("PERSEQ.INP", "r", stdin); freopen("PERSEQ.OUT", "w", stdout); cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; find(); return 0; }
Admin likes this post
Admin Admin
Tổng số bài gửi : 152 Join date : 23/04/2022 Age : 41 Đến từ : THPT Chuyên Nguyễn Tất Thành - Yên Bái
Tiêu đề: Re: T.18 Dãy con có tích lớn nhất Tue May 17, 2022 8:33 pm
Cách 1: Áp dụng phương pháp sinh dãy nhị phân có độ dài N. Với mỗi cấu hình ta thực hiện: for(i, 1, n) if (b[i] == 1) t*=a[i]; res = max(res, a[i]);
Độ phức tạp của thuật toán: O(2^n) Video hướng dẫn Cách 1:
Admin Admin
Tổng số bài gửi : 152 Join date : 23/04/2022 Age : 41 Đến từ : THPT Chuyên Nguyễn Tất Thành - Yên Bái
Tiêu đề: Re: T.18 Dãy con có tích lớn nhất Tue May 17, 2022 9:14 pm
Cách 2:? Nếu số lượng phần tử là số âm là chẵn thì return tích tất cả các phần tử. Còn lại, thực hiện: Phân rã bài toán: - Gọi S[i] là tích lớn nhất khi đi đến vị trị i. + a[i] có tham gia vào dãy kết quả: s[i-1]*a[i]; + a[i] không tham gia vào dãy kết quả: a[i]; Tổng hợp lời giải: - s[i] = max(s[i-1]*a[i], a[i]);
Khi đó kết quả của bài toán: res = max(res,s[i]);
Cách 3: - Đọc dữ liệu: Đếm số lượng số âm lưu vào d, tính tích các phần tử lưu vào S. - Nếu d chẵn thì đưa S ra, kết thúc. ngược lại, { tìm rmax; // số âm lớn nhất trong dãy số. kq = S / rmax; //không chọn số âm lớn nhất. đưa kq ra. } Đọ phức tạp của thuật toán: O(N).
Được sửa bởi Admin ngày Tue May 17, 2022 9:23 pm; sửa lần 1.
hdluong
Tổng số bài gửi : 19 Join date : 09/05/2022
Tiêu đề: Re: T.18 Dãy con có tích lớn nhất Tue May 17, 2022 9:22 pm
Code này không xử lí được trường hợp 2 số âm bằng nhau ạ :<
Code:
#include <iostream> #include <bits/stdc++.h> using namespace std; int n,a[100000]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); freopen("perseq.inp","r",stdin); freopen("perseq.out","w",stdout); cin >> n; int dem=0,t=1,vt,am=round(-1e9); for (int i=1;i<=n;i++) { cin >> a[i]; if (a[i]<0) { dem++; am=max(am,a[i]); if (dem%2!=0&&am==a[i]) vt=i; } t=t*a[i]; } int r1=1,r2=1; if (dem%2==0) cout << t; else { for (int i=1;i<vt;i++) r1=r1*a[i]; for (int i=n;i>vt;i--) r2=r2*a[i]; cout << max(r1,r2); } return 0; }