蒟蒻自己口胡了一个思路,但是 WA 79 pts。
大题思路就是拼完一根换下一根。
有没有大佬愿意造一个 hack 小数据?
#include <bits/extc++.h>
#define inline __always_inline
template <typename T> inline void chkmax(T &x, const T &y) { if (x < y) x = y; }
template <typename T> inline void read(T &x)
{
char ch;
for (ch = getchar(); !isdigit(ch); ch = getchar());
for (x = 0; isdigit(ch); ch = getchar()) x = x * 10 + (ch - '0');
}
const int MaxN = 70, MaxA = 55, MaxS = MaxA * MaxN;
int n, sum, max, a[MaxN], cnt[MaxS], ori[MaxS];
bool chk(int exp)
{
if (!exp) return 1;
for (int i = exp; i; i--)
if (cnt[i])
{
cnt[i]--;
if (chk(exp - i)) return 1;
cnt[i]++;
}
return 0;
}
int main()
{
read(n);
for (int i = 1; i <= n; i++) read(a[i]), sum += a[i], chkmax(max, a[i]), ori[a[i]]++;
for (int i = max; i < sum; i++)
if (sum % i == 0)
{
int bak = sum;
for (memcpy(cnt, ori, i + 1 << 2); sum && chk(i); sum -= i);
if (!sum) printf("%d", i), exit(0);
sum = bak;
}
printf("%d", sum);
return 0;
}