1. 程式人生 > 其它 >[紀中][總結]2021.08.11【NOIP提高A、B組】模擬

[紀中][總結]2021.08.11【NOIP提高A、B組】模擬

2021.08.11【NOIP提高A、B組】模擬

T1

正解顯然是 狀壓DP ,只用分別考慮六個面的狀態。
當然,這個資料氵水沝淼㵘,所以我們暴搜也能過(

狀壓的題解我不太會寫,就放 dalao lkj 的題解 \(link\)

然後暴搜要注意的的是,只用考慮三個面的情況,因為兩兩相對的,所以只用考慮三個面的情況。
然後注意初始值要儘量賦大(地板大到無法想象[doge]

Code - 暴搜

#include <bits/stdc++.h>
#define N 20
#define ll long long
using namespace std;

ll n, ans;
ll a[N], b[N], c[N], f[N];

inline void hhd (ll add, ll ae, ll be)
{
	if (add > ans) ans = add;
	for (int i = 1; i <= n; ++ i)
	{
		if (f[i]) continue;
		if (a[i] <= ae && b[i] <= be || a[i] <= be && b[i] <= ae)
		{
			f[i] = 1;
			hhd (add + c[i], a[i], b[i]);
			f[i] = 0;	
		} 
		if (a[i] <= ae && c[i] <= be || a[i] <= be && c[i] <= ae)
		{
			f[i] = 1;
			hhd (add + b[i], a[i], c[i]);
			f[i] = 0;	
		} 
		if (c[i] <= ae && b[i] <= be || c[i] <= be && b[i] <= ae)
		{
			f[i] = 1;
			hhd (add + a[i], b[i], c[i]);
			f[i] = 0;	
		} 
	}
	
}

int main ()
{
	scanf ("%lld", &n);
	for (int i = 1; i <= n; ++ i) scanf ("%lld%lld%lld", &a[i], &b[i], &c[i]);
	hhd (0, 999999999, 999999999);
	printf ("%lld", ans);
	return 0;
}

T2

簡單貪心,再跑一遍類似於克魯斯卡爾的奇怪亂搞即可

T3

神TM的迴文自動機,不會