Bài toán: Dãy số trung bìnhTì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....
Trang 1Bà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
m2, mn được xác định bởi công thức mi = (si + si+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 mi 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 mi(1<=mi<=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ớ ng trình không được phép sử dụng quá 16MB bộ nhớ c phép s d ng quá 16MB b nh ử dụng quá 16MB bộ nhớ ụng quá 16MB bộ nhớ ộ nhớ ớ
3
2
5
9
4
Thuật toán: Từ công thức mi = (si + si+1)/2 ta có mi >= si 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 s1 mà thôi vì khi có s1 ta có thể tính ra toàn bộ dãy s theo công thức của dãy m: si+1
= 2mi-1-si
Đặt s1 = a, ta có s2 = 2m1 - a <= m2 <=> a>= 2m1 - m2 Tương tự, với các bất đẳng thức s3<m3,
s4<m4, , sn < mn 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 Xmaxlà giá trị lớn nhất trong số các cận dưới của a, Ymin 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à Ymin - Xmax + 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ẻ