问题 3877 --寻找等差数列(完善程序)

3877: 寻找等差数列(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 4  解决: 2
[提交][状态][命题人:]

题目描述

有一些长度相等的等差数列(数列中每个数都为0~59的整数),设长度均为L,将等差数列中的所有数打乱顺序放在一起。现在给你这些打乱后的数,问原先, L最大可能为多大。先读入一个数n(1<=n<=60),再读入n个数,代表打乱后的数。输出等差数列最大可能长度L。


#include <cstdio>
int hash[60];
int n, x, ans, maxnum;
int work(int now) {
    int first, second, delta, i;
    int ok;
    while (__[1]__ && !hash[now])
        ++now;
    if (now > maxnum)
        return 1;
    first = now;
    for (second = first; second <= maxnum; second++)
        if (hash[second]) {
            delta = __[2]__;
            if (first + delta * __[3]__ > maxnum)
                break;
            if (delta == 0)
                ok = (__[4]__);
            else {
                ok = 1;
                for (i = 0; i < ans; i++)
                    ok = __[5]__ && (hash[first + delta * i]);
            }
            if (ok) {
                for (i = 0; i < ans; i++)
                    hash[first + delta * i]--;
                if (work(first))
                    return 1;
                for (i = 0; i < ans; i++)
                    hash[first + delta * i]++;
            }
        }
    return 0;
}
int main() {
    int i;
    memset(hash, 0, sizeof(hash));
    scanf("%d", &n);
    maxnum = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &x);
        hash[x]++;
        if (x > maxnum)
            maxnum = x;
    }
    for (ans = n; ans >= 1; ans--)
        if (n%ans == 0 && __[6]__) {
            printf("%d\n", ans);
            break;
        }
    return 0;
}


输入

输出

样例输入
Copy
40
8 8 9 9 10 10 11 11 12 12 13 13 14 14 14 15 15 17 19 20 22 23 23 25 26 27 28 29 31 31 32 34 35 35 37 39 40 43 43 47 
样例输出
Copy
8

提示

来源

[提交][状态]