ABC 369

目录

[D. Bonus EXP](#D. Bonus EXP)

[E. Sightseeing Tour](#E. Sightseeing Tour)


D. Bonus EXP

常规思路是 dp [ i ] 表示到前 i 个怪的最大收益值,因为要看奇偶性所以再加一维,0 表示当前这个怪打或不打共打了偶偶数怪,1 表示打

复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 1e18;

int T, n, cnt, ans, a[N], dp[N][2];
string s;

signed main()
{
	cin >> n;
	for (int i = 1; i <= n; i ++)
		cin >> a[i];
	dp[1][0] = 0, dp[1][1] = a[1];
	for (int i = 2; i <= n; i ++)
	{
		dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + 2 * a[i]);
		dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + a[i]);
	}
	ans = max(dp[n][0], dp[n][1]);
	cout << ans;
	return 0;
}

E. Sightseeing Tour

n 小于 400,可以先 floyd 求出两两之间的最短路。对于必走的 k 条边,先全排列,同时要考虑双向。答案就是 k 条边内部的累积和加上 1 到全排列的第一个的起点加上全排列最后一个的终点到 n 的最短路。

在 floyd 前要有两次初始化,一次是自己到自己置为 0,其余 INF,一次是存在边的两点赋初值。

复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5, INF = 1e18;

struct node
{
	int u, v, w;
}e[N];

int T, n, m, q, cnt, ans, a[405], f[405][405], vis[10];

void dfs(int u, int pos, int tot, int k)
{
	if(pos > k)
	{
		tot += f[u][n];
		ans = min(ans, tot);
		return;
	}
	for (int i = 1; i <= k; i ++)
	{
		if (vis[i] == 1)
			continue;
		vis[i] = 1;
		int d = f[u][e[a[i]].u] + e[a[i]].w;
		dfs(e[a[i]].v, pos + 1, tot + d, k);
		d = f[u][e[a[i]].v] + e[a[i]].w;
		dfs(e[a[i]].u, pos + 1, tot + d, k);
		vis[i] = 0;
	}
}

signed main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i ++)
		for (int j = 1; j <= n; j ++)
			f[i][j] = i == j ? 0 : INF;
	for (int i = 1; i <= m; i ++)
	{
		cin >> e[i].u >> e[i].v >> e[i].w;
		f[e[i].u][e[i].v] = min(f[e[i].u][e[i].v], e[i].w), f[e[i].v][e[i].u] = min(f[e[i].v][e[i].u], e[i].w);
	}
	for (int k = 1; k <= n; k ++)
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= n; j ++)
				f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
	cin >> q;
	while (q --)
	{
		int k;
		cin >> k;
		ans = INF;
		for (int i = 1; i <= k; i ++)
			cin >> a[i];
		for (int i = 1; i <= k;i ++)
			vis[i] = 0;
		dfs(1, 1, 0, k);
		cout << ans << '\n';
	}
	return 0;
}
相关推荐
Fuyo_11191 分钟前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记
小白|2 分钟前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
nebula-AI2 分钟前
人工智能导论:模型与算法(未来发展与趋势)
人工智能·神经网络·算法·机器学习·量子计算·automl·类脑计算
王老师青少年编程3 分钟前
2026年全国青少年信息素养大赛“算法应用主题赛”(初赛)【C++考点大纲】(全场景、组别):文末附备考秘籍!
c++·全国青少年信息素养大赛·初赛·2026年·算法应用主题赛·考点大纲
炽烈小老头4 分钟前
【每天学习一点算法 2026/05/21】课程表
学习·算法
Season4505 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
luoganttcc7 分钟前
大模型是否即将到达算法极限
算法
咩咦26 分钟前
C++学习笔记22:前置后置 ++/-- 和日期减日期
c++·学习笔记·运算符重载·日期类·前置++·后置++·日期减日期
计算机安禾31 分钟前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式
叶小鸡35 分钟前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划