小红书2023/08/06Java后端笔试 AK

T1(模拟、哈希表)

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<string, int> PSI;

const int N = 1e5 + 10;

void solve() {
	string line, t;
	getline(cin, line);

	line += ' ';
	vector<PSI> ans;
	unordered_map<string, int> cnt;
	for(int i = 0; i < line.size(); i ++) {
		if(line[i] == ' ') cnt[t] ++ , t = "";
		else t += line[i];
	}

	for(auto kv : cnt) {
		if(kv.second >= 3) ans.push_back(make_pair(kv.first, kv.second));
	}

	sort(ans.begin(), ans.end(), [](PSI& a, PSI& b) {
		if(a.second != b.second) return a.second > b.second;
		return a.first < b.first;
	});

	for(auto ss : ans) cout << ss.first << endl;

}

int main() {
	cin.tie(0); cout.tie(0);
	std::ios::sync_with_stdio(false);

	int T = 1;
//	cin >> T;
	while(T --) {
		solve();
	}

	return 0;
}

T2(01背包)

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 55, M = 510;

int n, t_limit, h_limit;
int t[N], h[N], a[N];
LL f[N][M][M];

void solve() {
	cin >> n;
	cin >> t_limit >> h_limit;
	for(int i = 1; i <= n; i ++) cin >> t[i] >> h[i] >> a[i];

	for(int j = t[1]; j < M; j ++) {
		for(int k = h[1]; k < M; k ++) {
			f[1][j][k] = a[1];
		}
	}

	for(int i = 2; i <= n; i ++) {
		for(int j = 1; j <= t_limit; j ++) {
			for(int k = 1; k <= h_limit; k ++) {
				f[i][j][k] = max(f[i][j][k], f[i - 1][j][k]);
				if(j - t[i] < 0 || k - h[i] < 0) continue;
				f[i][j][k] = max(f[i][j][k], f[i - 1][j - t[i]][k - h[i]] + 0ll + a[i]);
			}
		}
	}

	LL ans = 0;
	for(int j = 1; j < M; j ++)
		for(int k = 1; k < M; k ++)
			ans = max(ans, f[n][j][k]);

	cout << ans << endl;
}

int main() {
	cin.tie(0); cout.tie(0);
	std::ios::sync_with_stdio(false);

	int T = 1;
//	cin >> T;
	while(T --) {
		solve();
	}

	return 0;
}

T3(树形DP)

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10, M = N * 2;

int n, v[N];
int h[N], e[M], ne[M], idx;

int cnt;
int primes[M];
bool st[M];

int f[N][2];

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void get_primes(int n) {
	st[1] = true;
	for(int i = 2; i <= n; i ++) {
		if(!st[i]) primes[cnt ++ ] = i;
		for(int j = 0; primes[j] <= n / i; j ++) {
			st[primes[j] * i] = true;
			if(i % primes[j] == 0) break;
		}
	}
}

int dp(int u, int ban, int p) {
	int& cur_level = f[u][ban];
	if(cur_level != -1) return cur_level;

	cur_level = 0;
	int rec = 0, miv = M, node_id = -1;
	for(int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i];
		if(j == p) continue;
		if(!st[v[u] + v[j]]) {
			if(ban) {
				cur_level += max(dp(j, 1, u) + 1, dp(j, 0, u));
			} else {
				rec += dp(j, 0, u);
				if(miv > dp(j, 0, u)) {
					miv = dp(j, 0, u);
					node_id = j;
				}
			}
		} else {
			cur_level += max(dp(j, 1, u), dp(j, 0, u));
		}
	}

	if(node_id != -1) cur_level += (rec - miv) + max(dp(node_id, 0, u), dp(node_id, 1, u) + 1);

	return cur_level;
}

void solve() {
	cin >> n;
	for(int i = 1; i <= n; i ++) cin >> v[i];

	memset(f, -1, sizeof f);
	memset(h, -1, sizeof h);
	for(int i = 0; i < n - 1; i ++) {
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}

	cout << max(dp(1, 0, -1), dp(1, 1, -1)) << endl;
}

int main() {
	cin.tie(0); cout.tie(0);
	std::ios::sync_with_stdio(false);

	get_primes(200000);

	int T = 1;
//	cin >> T;
	while(T --) {
		solve();
	}

	return 0;
}
相关推荐
烬羽4 分钟前
一个队列,怎么让滑动窗口从 O(nk) 变 O(n)?单调队列彻底搞懂
javascript·数据结构·算法
XH华12 分钟前
C++语言第四章:模板初阶
数据结构·c++·算法
纳兰青华13 分钟前
拼图大师:从“暴力尝试“到“动态规划“的拆字艺术
java·算法·动态规划
星马梦缘22 分钟前
算法设计导论 课堂笔记
算法·动态规划·分治·时间复杂度·最优二叉树
luj_176811 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海14 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz14 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni14 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu15 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_79815 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法