没开longlongT了但是开longlong过了?
查看原帖
没开longlongT了但是开longlong过了?
1156268
NagoriYuuuki楼主2024/4/28 21:54

  非常怪的开 long long 过了然后没开 long long T了
  这个是 AC 的,但是把 #define int long long 注释掉就TLE#30了,最大的数据应该也就是 sumsum ,但是范围是65×5065 × 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;
}  
2024/4/28 21:54
加载中...