Hướng dẫn cho Tìm kiếm ID hợp lệ
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Authors:
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
💡 Gợi ý giải bài "Tìm kiếm ID hợp lệ"
1. Hướng tiếp cận (Mô phỏng)
- Duyệt qua từng ID bài nộp từ đầu đến cuối theo đúng thứ tự thời gian.
- Khởi tạo biến lưu kết quả:
lastcreate = 0.
2. Cấu trúc dữ liệu phù hợp
- Vì ID có giá trị rất lớn (lên tới \(10^9\)), bạn không thể dùng mảng đánh dấu (
boolhoặcint) thông thường vì sẽ bị tràn bộ nhớ. - Giải pháp: Sử dụng cấu trúc dữ liệu Tập hợp (Set) để lưu trữ các ID đã xuất hiện. Tập hợp giúp kiểm tra một phần tử đã tồn tại hay chưa với độ phức tạp cực nhanh (\(O(1)\) hoặc \(O(\log N)\)).
- C++:
std::sethoặcstd::unordered_set - Python:
set()
3. Thuật toán xử lý từng bước
Với mỗi ID \(A_i\) trong danh sách, ta kiểm tra:
- Điều kiện cập nhật: Nếu \(A_i > \text{lastcreate}\) VÀ \(A_i\) chưa có trong tập hợp
da_xuat_hien. - Hành động: * Cập nhật
lastcreate = A_i. - Đánh dấu: Luôn thêm \(A_i\) vào tập hợp
da_xuat_hiensau khi kiểm tra (dù có được cập nhật hay không).
4. Lưu ý quan trọng
- Đọc/Ghi file: Đừng quên cấu hình đọc từ file
tkidhl.inpvà ghi ra filetkidhl.outtheo yêu cầu đề bài. - Kiểu dữ liệu: Sử dụng kiểu số nguyên lớn (
long longtrong C++) cho các ID để tránh lỗi tràn số.
C++
#include <iostream>
#include <set>
#include <cstdio>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("tkidhl.inp", "r", stdin);
freopen("tkidhl.out", "w", stdout);
int n;
if (!(cin >> n)) return 0;
set<long long> s;
long long ans = 0;
for (int i = 0; i < n; ++i) {
long long x;
cin >> x;
if (x > ans && !s.count(x)) {
ans = x;
}
s.insert(x);
}
cout << ans << "\n";
return 0;
}
Bình luận