非常怪的开 long long 过了然后没开 long long T了
这个是 AC 的,但是把 #define int long long 注释掉就TLE#30了,最大的数据应该也就是 sum ,但是范围是65×50 远不及 int 的范围吧,不懂(
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define int long long
#define endl '\n'
#define ULL unsigned long long
#define xx first
#define yy second
#define PII pair
const int MAXN = 1e6 + 10;
const int MOD = 998244353;
const int mod = 1e9 + 7;
const double eps = 1e-8;
int _x[] = { 1,-1,0,0 };
int _y[] = { 0,0,1,-1 };
int arr[80];
bool vis[80];
int n;
int skip[80];
int cnt[80];
int _max = -100;
int _min = 100;
void dfs(int stk, int num, int aim, int len, int idx)
{
if (len == aim)
{
if (stk == num + 1)
{
cout << aim << endl;
exit(0);
}
else
{
num++;
len = 0;
idx = _max;
}
}
for (int i = idx; i >= _min; i--)
{
if (!cnt[i] || len + i > aim)
continue;
cnt[i]--;
dfs(stk, num, aim, len + i, i);
cnt[i]++;
if (len == 0 || len + i == aim)
return;
}
//for (int i = 1; i <= n; i++)
//{
// if (vis[i] || arr[i] + len > aim)
// continue;
// vis[i] = 1;
// dfs(stk, num, aim, len + arr[i]);
// vis[i] = 0;
// if (len == 0 || len + arr[i] == aim)
// return;
// if (arr[i] != arr[n])
// i = skip[arr[i]];
//}
}
//9 18
//5 2 1 5 2 1 5 2 1
//1 0 1 0 0 0 0 0 0
//6
signed main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
int sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
sum += arr[i];
_max = max(_max, arr[i]);
_min = min(_min, arr[i]);
cnt[arr[i]]++;
}
//cout << sum << endl;
//sort(arr + 1, arr + n + 1, [](int x, int y)
// {
// return x > y;
// });
//for (int i = 2; i <= n; i++)
// if (arr[i] != arr[i - 1])
// skip[arr[i - 1]] = i;
int temp = (sum >> 1);
for (int i = _max; i <= temp; i++)
{
if (sum % i)
continue;
int x = sum / i;
dfs(x, 0, i, 0, _max);
}
cout << sum << endl;
return 0;
}