九省聯考總結

前言

(施工中)

博主按照正常省選時間嘗試了九省聯考,總體而言呢,算中規中矩。Day1裏送的分比較足,T1一眼題,T2是一道不錯的思維題,T3好像沒能把暴力選手與正解選手區分開?Day2裏博主衝着A題去的,口胡了T1和T3的題解,無奈數據結構忘了個乾淨無法完全解決,T2貌似是神仙DP優化題,聽講全場最高60pts,博主調了1h纔拿到60,loj在題目後面說是“簡單題”,加上讀錯題坑了博主2h。這些值得反思。

總體而言,狀態優秀的話300+不是難題。

Day 1

一雙木棋

記錄輪廓線,然後隨便dp。(好像map會被卡,umap就不會啦)

#include <bits/stdc++.h>
#include <tr1/unordered_map>

#define rep(i, a, b) for (int i = a, i##end = b; i <= i##end; ++i)
#define per(i, a, b) for (int i = a, i##end = b; i >= i##end; --i)
#define rep0(i, a) for (int i = 0, i##end = a; i < i##end; ++i)
#define per0(i, a) for (int i = a-1; ~i; --i)
#define chkmin(a, b) a = std::min(a, b)
#define chkmax(a, b) a = std::max(a, b)
#define x first
#define y second

typedef long long ll;

const int inf = 1<<30;

inline int read() {
	int w = 0, f = 1; char c;
	while (!isdigit(c = getchar())) c == '-' && (f = -1);
	while (isdigit(c)) w = w*10+(c^48), c = getchar();
	return w * f;
}

int n, m, A[2][10][10];

std::tr1::unordered_map<ll, int> f;

ll calc(std::vector<int> S) {
	ll res = 0;
	rep0(i, S.size()) res = res*m+S[i];
	return res;
}

int dfs(std::vector<int> S, int cur) {
	ll keyS = calc(S);
	if (f.count(keyS)) return f[keyS];
	f[keyS] = -inf;
	rep0(i, n) {
		if (S[i] < m && (!i || S[i] != S[i-1])) {
			std::vector<int> _S = S; _S[i]++;
			dfs(_S, cur^1);
			chkmax(f[keyS], A[cur][i][S[i]] - f[calc(_S)]);
		}
	}
	return f[keyS] == -inf ? f[keyS] = 0 : f[keyS];
}

int main() {
	n = read(), m = read();
	rep0(cur, 2)
		rep0(i, n)
			rep0(j, m)
				A[cur][i][j] = read();
				
	std::vector<int> st; st.resize(n, 0);
	printf("%d", dfs(st, 0));
	return 0;
}

Day 2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章