随机化算法

文章讨论了一种通过贪心策略和二分查找来解决蛋糕分配的问题,目的是在有限的蛋糕和不同大小的嘴巴中找到最大满足人数。首先尝试将蛋糕分配给嘴小的人以获取局部最优解,然后使用二分查找来确定可能的最大满足人数,并通过随机打乱数组进行验证。最终找到全局最优解。
摘要由CSDN通过智能技术生成

切蛋糕

  • 贪心:对于同样的蛋糕,相比于给嘴大的人吃,给嘴小的人吃可以满足更多人。优先将蛋糕喂给嘴小的人可以获得局部最优解。
  • 判断:判断一个局部最优解是不是整体最优解,只能通过暴力的搜索的方式。但是这样的话会消耗很多的时间。
  • 二分:此题答案可行域连续,可以使用二分查找确定答案,再由搜索验证答案是否合理以缩小区间直到可以确定最优解。
  • random_shuffle,随机打乱一个数组。我们对于蛋糕多 random_shuffle 几遍

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int n, m, cke[MAXN + 10], mth[MAXN + 10], qz[MAXN + 10], cp[MAXN + 10], sum = 0; 
bool flag = 0;
bool check(int mid) {
	for(int p = 1; p <= 1500; p++) {
		for(int i = 1; i <= n; i++) cp[i] = cke[i];
		random_shuffle(cp + 1, cp + n + 1);
		bool eye = 0;//表示这样的蛋糕排列行不行
		for(int i = mid; i >= 1; i--) {//枚举每个嘴
			bool flag = 0;
			for(int j = 1; j <= n; j++) {//枚举每个蛋糕
				if(cp[j] >= mth[i]) {//能吃,吃
					cp[j] -= mth[i];
					flag = 1; break;
				}
			}
			if(!flag) {//如果不行,标记
				eye = 1;
				break;
			} 
		}
		if(!eye) return 1;//如果都行,直接返回
	}
	return 0;//mid 人不行
}
int main() {
	cin >> n; for(int p = 1; p <= n; p++) cin >> cke[p];
	cin >> m; for(int p = 1; p <= m; p++) cin >> mth[p];  
	sort(mth + 1, mth + m + 1);
	int l = 1, r = m;
	while(l <= r) {
		int mid = (l + r) >> 1;
		if(check(mid)) l = mid + 1;
		else r = mid - 1;
	}
	cout << r << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

El.十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值