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);
}
}
}

浙公网安备 33010602011771号