[KHTN - Thi thử TS10 #1 - 2026] Bài 2: MOVE
Xem dạng PDF
Gửi bài giải
Điểm:
5,00 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
1G
Input:
stdin
Output:
stdout
Dạng bài
Ngôn ngữ cho phép
C, C++, Java, Output Only, Pascal, PyPy, Python, Scratch, TEXT
Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài
Một tuyến khảo sát địa hình được mô tả bằng lát cắt dọc, bắt đầu tại mốc cao độ 0. Trong quá trình di chuyển dọc theo tuyến, thiết bị ghi lại sự thay đổi cao độ bằng chuỗi ký hiệu:
- '+': địa hình tăng cao 1 đơn vị
- '-': địa hình giảm thấp 1 đơn vị
- Chuỗi ký hiệu mô tả sự thay đổi cao độ liên tiếp giữa các điểm đo.
Yêu cầu: Hãy xác định chênh lệch cao độ lớn nhất giữa điểm cao nhất và điểm thấp nhất trên toàn tuyến khảo sát.
Input
- Dòng đầu tiên chứa ~n~, số đoạn đo (~1 \le n \le 10^5~).
- Dòng thứ hai chứa chuỗi gồm các ký tự '+' và '-'.
Output
In ra một số nguyên duy nhất là chênh lệch cao độ lớn nhất.
Sample Input 1
8
++-+-+--
Sample Output 1
2
Giải thích: Điểm cao nhất: 2; Điểm thấp nhất: 0.
Giới hạn
- 30% số test có ràng buộc bổ sung: ~n \le 10~.
- 30% số test khác có ràng buộc bổ sung: ~n \le 1000~.
- 40% số test còn lại không có ràng buộc bổ sung.
Bình luận
bài này bạn có thể sửa dụng prefix sum hoặc tính s
đối với prefix sum
n=int(input()) a=str(input()) pre=[0]*(n+1) for i in range(1,n+1): if a[i-1]=="+": pre[i]=pre[i-1]+1 else: pre[i]=pre[i-1]-1 print(max(pre)-min(pre))
đây là code python
Code day nhe mn
include<bits/stdc++.h>
using namespace std;
int main() { ios::syncwithstdio(false); cin.tie(NULL);
}
include <bits/stdc++.h>
using namespace std; const int MAXN=1e5+5; char a[MAXN]; int main(){ iosbase::syncwithstdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for (int i=1;i<=n;++i) cin>>a[i]; vector<int> v(n+1,0); for (int i=1;i<=n;++i){ if (a[i]=='+') v[i]=v[i-1]+1; else if (a[i]=='-') v[i]=v[i-1]-1; } int ans=INTMIN; int cnt=INT_MAX; for (auto &x:v){ ans=max(ans,x); cnt=min(cnt,x); } cout<<ans-cnt<
}