MLE 0pts求调 玄关!!!
查看原帖
MLE 0pts求调 玄关!!!
1069719
Enoch2013楼主2024/12/15 17:25

code:


#include <bits/stdc++.h>
using namespace std;
const int N = 31;
int n, a[N], b[N], sum[N], r[N], ans;
void input()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> b[i];
		a[i] = i;
	}
}
void init()
{
	for (int i = 1; i <= n; i++)
		sum[i] = b[i];
}
int dfs(int root)
{
	init();
	int l = 0, r = 0;
	for (int i = 1; i < n; i++)
		if (i == root)
			continue;
		else
		{
			int tmp1 = i, tmp2 = i + 1;
			if (tmp2 == root)
				tmp2++;
			int dtmp1 = dfs(tmp1), dl = dfs(l), dtmp2 = dfs(tmp2), dr = dfs(r);
			if (dtmp1 > dl)
			{
				l = tmp1;
				sum[l] = a[l];
			}
			if (dtmp2 > dr)
			{
				r = tmp2;
				sum[r] = a[r];
			}
		}
	return dfs(l) * dfs(r) + sum[root];
}
void update()
{
	for (int i = 1; i <= n; i++)
		r[i] = sum[i];
}
void solve()
{
	for (int i = 1; i <= n; i++)
	{
		int tmp = dfs(i);
		if (tmp > ans)
		{
			ans = tmp;
			update();
		}
	}
} 
void output()
{
	cout << ans << endl;
	for (int i = 1; i <= n; i++)
		cout << r[i] << ' ';
}
signed main()
{
	input();
	if (n == 1)
		cout << 1 << endl << b[1];
	else if (n == 2)
		cout << b[1] + b[2] << endl << a[1] << ' ' << a[2];
	else if (n == 3)
	{
		if (b[1] == 1 && b[2] == 1 && b[3] == 1)
			cout << 3 << endl << 1 << ' ' << 1 << ' ' << 1;
		else if (b[1] == 1 && b[2] == 1)
			cout << 2 + b[3] << endl << 1 << ' ' << 2 << ' ' << 3;
		else if (b[1] == 1 && b[3] == 1)
			cout << 2 + b[2] << endl << 1 << ' ' << 2 << ' ' << 3;
		else if (b[2] == 1 && b[3] == 1)
			cout << 2 + b[1] << endl << 1 << ' ' << 2 << ' ' << 3;
		else
		{
			if (b[1] > b[2])
			{
				swap(b[1], b[2]);
				swap(a[1], a[2]);
			}
			if (b[1] > b[3])
			{
				swap(b[1], b[3]);
				swap(a[1], a[3]);
			}
			cout << b[1] + b[2] * b[3] << endl << a[1] << ' ' << a[2] << ' ' << a[3];
		}
	}
	else
	{
		solve();
		output();
	}
}
2024/12/15 17:25
加载中...