#include <stdio.h>
#include <limits.h>
int s[4]; // 每科题目数量
int times[4][20]; // 每科题目所需时间
int mark[4] = { INT_MAX, INT_MAX, INT_MAX, INT_MAX }; // 初始化 mark 数组为最大值
int ans = 0; // 初始化答案为 0
// 定义搜索函数
void f(int left, int right, int step, int n) {
if (step == s[n]) { // 如果步数等于题目数量
int tmp = left > right ? left : right; // 选择左右大脑耗时的最大值
if (tmp < mark[n]) // 更新 mark 数组中的最小值
mark[n] = tmp;
return;
}
// 递归调用,分别处理左右大脑
f(left + times[n][step], right, step+1, n);
f(left, right + times[n][step], step+1, n);
}
int main() {
// 读取输入数据
for (int i = 0; i < 4; i++)
scanf("%d", &s[i]);
for (int i = 0; i < 4; i++)
for (int j = 0; j < s[i]; j++)
scanf("%d", ×[i][j]);
// 对每个科目进行搜索
for (int i = 0; i < 4; i++) {
f(0, 0, 0, i);
}
// 计算答案
for (int i = 0; i < 4; i++) {
ans += mark[i];
}
// 输出结果
printf("%d\n", ans);
return 0;
}
太久没更新了,因为春节到处玩,所以没写,脑子也变蠢了。所以我这个人很写,一题也没有懒哈哈哈
因为有四个科目,我们简单来想就是一科,然后循环四次而已。 假设其中一个科目有四道题,耗时分别为1,2,3,4,现在要总耗时最短,肯定是1和4组合,2和3组合,最少是5小时。如果用贪心的话,1和3,2和4,分别总耗时是4和6,所以不好。已知一次可以分别用左脑或者右脑,所以遍历的最坏结果是一科2的20次方(题目规定一科不超20个题),大概是1的6次方位数,所以还行,运算的过来。
然后就是递归分别处理左右脑,选大的那个,和mark打擂台,并记下擂台的位置,
ok了,家人们(陈泽.jpg)