Codeforces Round #748 (Div. 3) D2. Half of Same(dfs暴力+剪枝)

看没人用dfs,一种不正规做法(逃…

#include <bits/stdc++.h>
using namespace std;
const int maxn = 50;
int a[maxn] = {0};
int flag, ans2, n;
void dfs(int deep, int num, int now, int ans)
{
    if (ans != 0 && ans <= ans2)
        return;
    if (deep != n + 1 && n - deep + now + 1 < n / 2)
        return;
    if (now == n / 2)
    {
        if (ans > ans2)
            ans2 = ans;
        return;
    }
    if (deep == n + 1)
        return;
    dfs(deep + 1, num, now, ans);
    if (num != 1000001)
        ans = __gcd(ans, abs(a[deep] - num));
    dfs(deep + 1, a[deep], now + 1, ans);
}
signed main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        map<int, int> mp;
        flag = 0, ans2 = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
            mp[a[i]]++;
            if (mp[a[i]] >= n / 2)
                flag = 1;
        }
        if (flag)
            printf("-1\n");
        else
        {
            dfs(1, 1000001, 0, 0);
            printf("%d\n", ans2);
        }
    }
}
posted @ 2021-10-16 21:14  Star_tears  阅读(39)  评论(0)    收藏  举报