kkksc03考前临时抱佛脚
kkksc03考前临时抱佛脚
题目背景
kkksc03 的大学生活非常的颓废,平时根本不学习。但是,临近期末考试,他必须要开始抱佛脚,以求不挂科。
题目描述
这次期末考试,kkksc03 需要考
kkksc03 有一个能力,他的左右两个大脑可以同时计算
由于 kkksc03 还急着去处理洛谷的 bug,因此他希望尽快把事情做完,所以他希望知道能够完成复习的最短时间。
输入格式
本题包含
第
第
第
第
输出格式
输出一行,为复习完毕最短时间。
样例 #1
样例输入 #1
1 2 1 3
5
4 3
6
2 4 3
样例输出 #1
20
提示
题解
题解1(搜索
一种暴力搜索法。枚举一遍题目分配给左右脑的所有情况,最后得出最优值。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define SZ(v) ((int)v.size())
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
using namespace std;
const int N = 1e6+5;
int _;
int s[5];
int a[5][100];
int ans;
int L, R, minn; // L,R分别代表左右脑, minn是每一科获得的最小值
void dfs(int x, int y) {
if(y > s[x]) { // 题目已经分配给左右脑
minn = min(minn, max(L, R));
return;
}
L += a[x][y];
dfs(x, y+1); // 分配左脑
L -= a[x][y];
R += a[x][y];
dfs(x, y+1); // 分配右脑
R -= a[x][y];
}
void solve() {
for(int i = 1; i <= 4; i++) cin >> s[i];
for(int i = 1; i <= 4; i++) {
for(int j = 1; j <= s[i]; j++) {
cin >> a[i][j];
}
L = 0, R = 0;
minn = INT_MAX;
dfs(i, 1);
ans += minn;
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// cin >> _;
// while(_--) {
solve();
// }
return 0;
}
题解2 (DP)
因为一科内的所有题目只有两个装态,就是装进左脑/右脑,可以想象成01背包问题。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define SZ(v) ((int)v.size())
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
using namespace std;
const int N = 1e6+5;
int _;
int s[5];
int a[5][100];
int dp[100005];
int ans;
void solve() {
for(int i = 1; i <= 4; i++) {
cin >> s[i];
}
for(int i = 1; i <= 4; i++) {
int sum = 0;
for(int j = 1; j <= s[i]; j++) {
cin >> a[i][j];
sum += a[i][j];
}
for(int j = 1; j <= s[i]; j++) {
for(int k = sum / 2; k >= a[i][j]; k--) { // 这里设置背包大小为sum/2,也就是为了让左右脑获得的时间差值更小
dp[k] = max(dp[k], dp[k-a[i][j]]+a[i][j]);
}
}
ans += sum - dp[sum/2];
for(int j = 1; j <= sum/2; j++) dp[j] = 0;
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
// cin >> _;
// while(_--) {
solve();
// }
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理