这种做法正确性有什么问题?
  • 板块P1120 小木棍
  • 楼主mini564
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/9 20:23
  • 上次更新2024/11/9 22:32:51
查看原帖
这种做法正确性有什么问题?
1447006
mini564楼主2024/11/9 20:23

蒟蒻自己口胡了一个思路,但是 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;
}
2024/11/9 20:23
加载中...