[Mảng 1 Chiều Cơ Bản]. Bài 48. Dãy con liên tiếp tăng dài nhất
Xem dạng PDFCho mảng A[] gồm N phần tử nhiệm vụ của bạn là hãy liệt kê những dãy con liên tiếp tăng chặt dài nhất.
Gợi ý : So sánh a[i] và a[i - 1], nếu a[i] > a[i - 1] thì cập nhật độ dài dãy con hiện tại, ngược lại thì bạn so sánh độ dài dãy con kết thúc tại a[i - 1] so với kỷ lục đang có và cập nhật kết quả. Nếu độ dài dãy con đang có tốt hơn kỷ lục thì ghi nhận 1 dãy con, trường hợp độ dài dãy con hiện tại chỉ bằng dãy con kỷ lục thì tăng thêm 1 dãy con nữa. Nên dùng 1 mảng để lưu chỉ số bắt đầu của các dãy con thỏa mãn.
Đầu vào
• Dòng 1 là T : số bộ test
• Mỗi bộ test gồm 2 dòng
• Dòng 1 là N : số phần tử trong mảng
• Dòng 2 là N số trong mảng
Giới hạn
• 1<=T<=100
• 1<=N<=1000
• 0<=A[i]<=1000
Đầu ra
• Đối với mỗi bộ test dòng 1 in ra độ dài dãy con tăng chặt dài nhất, các dòng tiếp theo liệt kê các dãy con thỏa mãn trên từng dòng. Ngoài ra bạn cần ghi thêm số thứ tự bộ test. Xem test mẫu để rõ hơn yêu cầu.
Ví dụ :
Input 01
5
10
39 48 41 18 12 35 10 29 29 45
10
19 37 14 24 49 45 36 25 38 16
10
40 28 1 29 11 1 36 32 33 26
10
13 32 1 18 49 7 48 1 17 32
10
45 27 27 19 15 10 6 1 0 0
Output 01
Test #1 :
2
39 48
12 35
10 29
29 45
Test #2 :
3
14 24 49
Test #3 :
2
1 29
1 36
32 33
Test #4 :
3
1 18 49
1 17 32
Test #5 :
1
45
27
27
19
15
10
6
1
0
0
Bình luận
Tóm tắt thuật toán:
Biến ban đầu: Cần 3 mảng toàn cục: a[] (lưu dữ liệu), vitribatdau[] (lưu index bắt đầu dãy), và dodai[] (lưu độ dài dãy).
Khởi tạo test: Xóa sạch 2 mảng lưu trữ bằng memset, đặt biến id = 0 (số thứ tự dãy) và max_len = 1 (kỷ lục dài nhất).
Duyệt mảng: Chạy vòng lặp duy nhất for (i = 0; i < n; i++) quét qua các phần tử.
Mở dãy mới: Nếu dodai[id] == 0, ghi nhận vitribatdau[id] = i và đặt do_dai[id] = 1.
Nối dài dãy: Nếu phần tử sau lớn hơn phần tử trước (a[i] < a[i+1]), tăng do_dai[id]++.
Cập nhật kỷ lục: Lập tức gán maxlen = dodai[id] nếu độ dài đoạn hiện tại lớn hơn max_len.
Chốt dãy: Nếu đoạn bị đứt (a[i] >= a[i+1]) hoặc chạy đến phần tử cuối cùng, chốt dãy bằng cách tăng id++ để đếm đoạn mới.
Kết thúc quét: Hoàn thành vòng lặp, ta đã có sẵn max_len và thông tin lưu trữ của mọi đoạn tăng để đem đi xử lý tiếp.
include <bits/stdc++.h>
using namespace std;
int main() { iosbase::syncwith_stdio(false); cin.tie(NULL); int n,res; cin>>n; int d=n; int c=1; while(n--){ int b=d-n; cout<<"Test #"<<b<<" :"<<'\n'; int m; cin>>m; int a[m]; int sum=1; for (int i=0;i<m;i++){ cin>>a[i]; if (i>0){ if(a[i]-a[i-1]>0){ sum++; } else if (sum!=1&&a[i]-a[i-1]<=0){ if (sum>=c){ c=sum; } sum=1; } } } if (sum >= c) { c = sum; } if (c==1){ cout<<c<<'\n'; for (int i=0;i<m;i++){ cout<<a[i]<<'\n'; } } else{ cout<<c<<'\n';
}
include<bits/stdc++.h>
using namespace std;
int a[1005];
vector v;
int main(){
} cho ae quả code rảnh rỗi =))
Full AC:
include <bits/stdc++.h>
using namespace std; using ll = long long;
int DEM = 1;
void run_case() { int n; if (!(cin >> n)) return; vector<int> a(n); for (int &x : a) cin >> x;
}
int main() { ios::syncwithstdio(false); cin.tie(nullptr);
}
include <stdio.h>
int a[1005], pos[1005];
int main() { int T, n; scanf("%d", &T); for (int t = 1; t <= T; ++t) { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
}
include <bits/stdc++.h>
using namespace std;
void solve(int x) { int n; cin >> n; vector<int> A(n); for (int &x : A) { cin >> x; }
}
int main() { int T; cin >> T;
}
include <iostream>
using namespace std; const int N=100+5; int a[N],s[N]; int T,n; int main() { cin>>T;
}
giúp mình với
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
xin link a
include <bits/stdc++.h>
using namespace std; int n,a[1000000]; vector<int>b; int main() { int t; cin>>t; int k=1; while(t--) { cin>>n; for(int i=0; i<n; i++) cin>>a[i]; int dem=1,m=0; for(int i=0; i<n; i++) { if(a[i]<a[i+1]) dem++; else { m=max(m,dem); dem=1; } } cout<<"Test #"<<k<<" :"<<endl;k++; cout<<m<
include <bits/stdc++.h>
using namespace std;
bool nt(int n) { if (n <= 1) return false; for (int i = 2; i <= sqrt(n); i++) { if (n % i == 0) return false; } return true; }
int main() { int n; cin >> n; int a[n]; for (int i = 0; i < n; i++) { cin >> a[i]; }
} bai nay em dan sai bai nay cua 46 a
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
include <bits/stdc++.h>
using namespace std; void xuat(vector<int>& subseq) { for (int num : subseq) { cout << num << " "; } cout << endl; } int main() { int T; cin >> T; for (int t = 1; t <= T; ++t) { int N; cin >> N; vector<int> A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } int maxlen = 0; vector all subseq;
vector<int> subseq;
for (int i = 0; i < N; ++i) {
if (i == 0 || A[i] > A[i - 1]) {
subseq.pushback(A[i]);
} else {
if (subseq.size() >= maxlen) {
if (subseq.size() > maxlen) {
allsubseq.clear();
maxlen = subseq.size();
}
allsubseq.pushback(subseq);
}
subseq.clear();
subseq.pushback(A[i]);
}
}
if (subseq.size() >= maxlen) {
if (subseq.size() > maxlen) {
allsubseq.clear();
maxlen = subseq.size();
}
allsubseq.pushback(subseq);
}
cout << "Test #" << t << " :\n";
cout << maxlen << endl;
for (vector<int>& seq : allsubseq) {
xuat(seq);
}
}
return 0;
}
Bài giải chỉ mang tính chất tham khảo cho những ai chưa biết làm nhé!