From ebb579dd31a19a4d08a8e9aae97c5fc354bc3e8b Mon Sep 17 00:00:00 2001 From: Raphael McSinyx Date: Fri, 11 Aug 2017 13:43:15 +0700 Subject: Add 12/QG-2007/maxiseq.c --- 12/QG-2007/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 12/QG-2007/maxiseq.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 12/QG-2007/README.md create mode 100644 12/QG-2007/maxiseq.c (limited to '12') diff --git a/12/QG-2007/README.md b/12/QG-2007/README.md new file mode 100644 index 0000000..a58798f --- /dev/null +++ b/12/QG-2007/README.md @@ -0,0 +1,43 @@ +# KÌ THI CHỌN HỌC SINH GIỎI QUỐC GIA THPT NĂM 2007 + +## Dãy con không giảm dài nhất + +Cho dãy số nguyên dương a1, a2, …, an. + +Dãy số ai, ai+1, …, aj thỏa mãn ai +≤ ai+1 ≤ … ≤ aj với 1 ≤ i ≤ j ≤ n được gọi là dãy con +không giảm của dãy số đã cho và khi đó số j - i + 1 được gọi là độ dài của dãy +con này. + +### Yêu cầu + +Hãy tìm dãy con có độ dài lớn nhất trong số các dãy con không giảm của dãy số +đã cho mà các phần tử của nó đều thuộc dãy số (uk) xác định bởi: + +* u1 = 1; +* uk = uk-1 + k (k ≥ 2). + +### Dữ liệu + +* Dòng đầu tiên chứa một số nguyên dương n (n ≤ 10000); +* Dòng thứ i trong n dòng tiếp theo chứa một số nguyên dương ai là + số hạng thứ i của dãy số đã cho (ai ≤ 108, i = 1, 2, …, + n). + +### Kết quả + +Số nguyên d là độ dài của dãy con không giảm tìm được (quy ước rằng nếu không +có dãy con nào thỏa mãn điều kiện đặt ra thì d = 0). + +### Ví dụ + +| MAXISEQ.INP | MAXISEQ.OUT | +| ----------------------------------------------- | :---------: | +| 8
2
2007
6
6
15
16
3
21 | 3 | + +#### Giải thích + +Các dãy con không giảm của dãy số đã cho mà các phần tử của nó đều thuộc dãy +(uk) là: 6, 6, 15 và 3, 21 (vì u2 = 3, u3 = 6, +u5 = 15, u6 = 21). Dãy cần tìm là 6, 6, 15 có độ dài là +3. diff --git a/12/QG-2007/maxiseq.c b/12/QG-2007/maxiseq.c new file mode 100644 index 0000000..94c15c8 --- /dev/null +++ b/12/QG-2007/maxiseq.c @@ -0,0 +1,36 @@ +#include +#include + +char is_in_u(long x) +{ + long y = (long) sqrt(x *= 2); + return y * (y + 1) == x; +} + +int main() +{ + FILE *f = fopen("MAXISEQ.INP", "r"); + short n, i, max = 0, start = -1; + long a, b; + + fscanf(f, "%hd\n", &n); + for (i = 0; i < n; i++) { + b = a; + fscanf(f, "%ld\n", &a); + if (!is_in_u(a) || start >= 0 && b > a) { + start = -1; + continue; + } + if (start < 0) + start = i; + if (i - start >= max) + max = i - start + 1; + } + fclose(f); + + f = fopen("MAXISEQ.OUT", "w"); + fprintf(f, "%hd\n", max); + fclose(f); + + return 0; +} -- cgit 1.4.1