P2392 kkksc03考前临时抱佛脚

题目链接:

这道题的题意容易引起歧义。
举一个 \(\rm Hack\) 数据。

2 1 100 2

答案应该为 \(100\) \((\)左脑算 \(100,\) 右脑算 \(2+1+2,\) 答案是 \(100)\)

第一个科目
有一题,所以我们可以得到:

1、全左脑:耗时 \(5\)

2、全右脑:耗时 \(5\)

因此第一个科目的最小时间为 \(5\) 分钟。

第二个科目
有两题,所以我们可以得到:

1、全左脑:耗时 \(4+3=7\)

2、左脑解题 \(1\),右脑解题 \(2\):耗时 \(\max(4,3)=4\)

3、左脑解题 \(2\),右脑解题 \(1\):耗时 \(\max(3,4)=4\)

4、全右脑:耗时 \(4+3=7\)

因此第二个科目的最小时间为 \(4\) 分钟。

第三个科目
有一题,所以我们可以得到:

1、全左脑:耗时 \(6\)

2、全右脑:耗时 \(6\)

因此第三个科目的最小时间为 \(6\) 分钟。

第四个科目
有三题,所以我们可以得到:

1、全部左脑完成。这样耗时为 \(2+4+3=9\)

2、左脑完成1、2题,右脑完成3题。这样耗时是 \(\max(2+4, 3)=6\)

3、左脑完成1、3题,右脑完成2题。这样耗时是 \(\max(2+3, 4)=5\)

4、左脑完成1题,右脑完成2、3题。这样耗时是 \(\max(2, 4+3)=7\)

5、左脑完成2 3题,右脑完成1题。这样耗时是 \(\max(4+3, 2)=7\)

6、左脑完成2题,右脑完成1、3题。这样耗时是 \(\max(4, 3+2)=5\)

7、左脑完成3题,右脑完成1、2题。这样耗时是 \(\max(3, 2+4)=6\)

8、全部右脑完成。这样耗时为 \(2+4+3=9\)

因此第四个科目的最小时间为 \(5\) 分钟。

总时间显然为 \(5+4+6+5=20\)

每道题有两种选择,分给左脑或右脑,因此可以 \(\rm DFS\)。本题数据量为 \(20\),因此不会超时。

形式一:形参版本(无需恢复现场)

#include <bits/stdc++.h>

int w[5], S[5][25];
int min = 0x3f3f3f3f, ans;

void dfs(int u, int i, int l, int r) {
	if (u > w[i]) {
		min = std::min(min, std::max(l, r));
		return;
	}
	dfs(u + 1, i, l + S[i][u], r);
	dfs(u + 1, i, l, r + S[i][u]);
}

int main()
{
	std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
	std::cin >> w[1] >> w[2] >> w[3] >> w[4];
	for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= w[i]; j++) {
			std::cin >> S[i][j];
		}
	}
	
	for (int i = 1; i <= 4; i++) {
		min = 0x3f3f3f3f;
		dfs(1, i, 0, 0);
		ans += min;
	}
	std::cout << ans;
	return 0;
}

形式二:设置全局变量(需恢复现场)

#include <bits/stdc++.h>

int w[5], S[5][25];
int min = 0x3f3f3f3f, ans, l, r;

void dfs(int u, int i) {
	if (u > w[i]) {
		min = std::min(min, std::max(l, r));
		return;
	}
	l += S[i][u];
	dfs(u + 1, i);
	l -= S[i][u];
	r += S[i][u];
	dfs(u + 1, i);
	r -= S[i][u];
}

int main()
{
	std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
	std::cin >> w[1] >> w[2] >> w[3] >> w[4];
	for (int i = 1; i <= 4; i++) {
		for (int j = 1; j <= w[i]; j++) {
			std::cin >> S[i][j];
		}
	}
	
	for (int i = 1; i <= 4; i++) {
		min = 0x3f3f3f3f;
		l = r = 0;
		dfs(1, i);
		ans += min;
	}
	std::cout << ans;
	return 0;
}
posted @ 2024-04-03 21:04  胖柚の工作室  阅读(78)  评论(0)    收藏  举报