小红书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;
}
相关推荐
xiaoshiguang33 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡3 小时前
【C语言】判断回文
c语言·学习·算法
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos4 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习5 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc5 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
苓诣6 小时前
不同路径
动态规划