Bài toán: Dãy số trung bình
Tìm các dãy số trong dãy số nguyên cho trước nhận dãy số m đã cho làm dãy số trung bình....
Đề bài: Xét dãy số nguyên không giảm S
1
, S
2
, ..., S
n+1
(S
i
<= S
i+1
). Dãy m
1
,
m
2
, ...m
n
được xác định bởi công thức m
i
= (s
i
+ s
i+1
)/2 (1<=i<=n) gọi là dãy trung
bình của dãy S. Ở đây ta chỉ xét trường hợp m
i
là số nguyên. Cho trước dãy m,
nhiệm vụ của bạn là tìm tất cả những dãy S nhận dãy m làm dãy trung bình
Input: Dữ liệu vào từ file Mean.inp gồm
Dòng đầu tiên chứa số nguyên N (1<=N<=5 000 000)
N dòng sau, dòng thứ i chứ số nguyên m
i
(1<=m
i
<=1 000 000 000)
Output: Dữ liệu ra ghi lên file Mean.out gồm một số nguyên duy nhất là số lượng dãy S thỏa yêu cầu
đề bài mà bạn tìm được
Ràng buộc: Chương trình không được phép sử dụng quá 16MB bộ nhớ.
MEAN.INP MEAN.OUT
3
2
5
9
4
Thuật toán: Từ công thức m
i
= (s
i
+ s
i+1
)/2 ta có m
i
>= s
i
. Bản chất của bài toán thật ra là yêu cầu ta
tìm tập giá trị của s
1
mà thôi vì khi có s
1
ta có thể tính ra toàn bộ dãy s theo công thức của dãy m: s
i+1
=
2m
i-1
-s
i
.
Đặt s
1
= a, ta có s
2
= 2m
1
- a <= m2 <=> a>= 2m
1
- m
2
. Tương tự, với các bất đẳng thức s
3
<m
3
,
s
4
<m
4
, ..., s
n
< m
n
ta cũng suy ra được các giới hạn khác của a. Tuy nhiên, chỉ có hai dạng chung là:
a >= x
a <= y
Gọi X
max
là giá trị lớn nhất trong số các cận dưới của a, Y
min
là giá trị nhỏ nhất trong số các cận trên của
A. Khi đó, dãy số S thỏa yêu cầu đề bài là Y
min
- X
max
+ 1. Độ phức tạp của thuật toán chỉ là O(n)!
Download chương trình (mean.pas)
Theo tin học và tuổi trẻ