本题对时间复杂度没有很高的要求
做题经历:
1.我刚开始想的是贪心算法,每次都选最平均的结果,结果很显然wa掉了
2.我想的是既然对时间复杂度没有要求,就和回溯问题一样,装入背包再拿出背包,但是我采用的是二重for循环,先选了第一个给左脑,在这个条件下再选一个给右脑,但是很显然TLE掉了
题目分析:我们可以知道,MINT=min(MINT,max(左脑,右脑));
左脑和右脑是等价的,我们只需要枚举一个脑获得尽可能少的时间,让另外脑相对均衡
比如说 我们有 时间分别为3, 3,4 ,5的难题
左脑获得3 4 右脑 3 5 和 左脑获得 3 5 右脑 3 4的MINT是一样的
#include <iostream>
#include<algorithm>
#include <cstring>
using namespace std;
int MINT;
int ans;
int l, r;
int visit[25];
int a[25], b[25], c[25], d[25];
void dfs(int s[],int len,int now)
{/*
有一串题 3 3 4 5
左 3 3 4 5 右
左 3 3 4 右 5
左 3 3 5 右 4
左 3 3 右 4 5
左 3 4 右 3 5
左 3 5 右 3 4
所以通过dfs是可以实现枚举的效果的,需要去理解dfs的原理
*/
if (now >= len) //如果分配完了才开始比较
{
MINT = min((int)max(l, r), MINT);
return;
}
l += s[now]; //分配给左脑下标为now的题
dfs(s, len, now + 1);
l -= s[now]; //回溯
r += s[now]; //分配给右脑
dfs(s, len, now + 1);
r -= s[now]; //回溯
}
int main()
{
int s[4];
cin >> s[0] >> s[1] >> s[2] >> s[3];
int* p[4] = { a,b,c,d };
for (int i = 0;i < 4;i++)
for (int j = 0;j < s[i];j++)
cin >> p[i][j];
for (int i = 0;i < 4;i++)
{
MINT = 1e9;l = r = 0;
dfs(p[i], s[i], 0); //s[i]表示总题目数,0代表现在看了几道题
ans += MINT;
}
cout << ans;
}