P2392 kkksc03考前临时抱佛脚

本题对时间复杂度没有很高的要求 

做题经历:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值