【基础搜索】Star星海

好美的题目描述~好有文采啊~我也要和星星玩...TAT


1.星海

AQ从小就希望能够摘下漫天星空中的星星,满载一船星辉,在星辉斑斓里放歌。

一天AQ 正在沉浸于自己的想象中的时候,星辉女神出现在了AQ 的面前。星辉女神给了AQ 几个闪烁光辉的盆子,

并告诉他,只要在盆子里放进清水,在这个夏夜的星海里,爱玩的星星们便会纷纷下落,进入盆子中嬉戏玩水。只要AQ及时抓住星星们,就可以天天与星星们游戏。

AQ希望有尽量多的星星与他游戏。但是星辉女神给 的盆子有一定的大小,每个星星也有一定的体积。

给出每个盆子的大小与星星的体积,请求出 最多能有多少的星星与他游戏。


基础的搜索题..想复杂了。

不过有各种技巧。

首先这道题必须迭代(二分深度或枚举深度都行)

原因在于为了加速,我们要从大到小枚举星星在哪个盆子。这样可以减少搜索枝。

经测试一个0.02的点如果从小到大枚举可以超时..差别巨大啊。

然后加几个剪枝。

1.如果这个星星的体积和上一个一样,那么有个小剪枝(详见程序)否则超3个点。

2.剩余空间已经不够了,直接return false

然后就过了..TAT..


code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<climits>
#include<algorithm>
#include<cstring>
#include<windows.h>
#define ot "%d"
#define kg " "
#define kh "\n"
#define olt "%I64d"
#define ll long long
#define max(a, b) ({int _ = (a), __ = (b); _ > __ ? _ : __;})
#define min(a, b) ({int _ = (a), __ = (b); _ < __ ? _ : __;})
#define swap(a, b) ({int _ = (a); a = (b); b = _;})
#define maxn 55
#define maxm 1025

using namespace std;

int n, m, aa[maxn], a[maxn], b[maxm], waste, limit, tot, sum[maxn];

void init()
{
	freopen("star.in", "r", stdin);
	freopen("star.out", "w", stdout); tot = 0;
	scanf(ot, &n);	for (int i = 1; i <= n; ++i) scanf(ot, &a[i]), tot += a[i];
	scanf(ot, &m);	for (int i = 1; i <= m; ++i) scanf(ot, &b[i]);
	sort(a + 1, a + n + 1);	sort(b + 1, b + m + 1); sum[0] = 0;
	for (int i = 1; i <= m; ++i) sum[i] = sum[i - 1] + b[i];
}

bool dfs(int res, int k)
{
	if (!res) return 1;
	if (waste > limit) return 0;
	for (int i = k; i <= n; ++i)
		if (a[i] >= b[res])
		{
			a[i] -= b[res];
			if (a[i] < b[1]) waste += a[i];
			if (b[res] == b[res - 1]) if (dfs(res - 1, i)) return 1; else; //The 'so-called' little prune
				else if (dfs(res - 1, 1)) return 1;
			if (a[i] < b[1]) waste -= a[i];
			a[i] += b[res];
		}
	return 0;
}

int main()
{
	init();
	int l = 0, r = m, mid;
	memcpy(aa, a, sizeof a);
	while (l != r)
	{
		mid = (l + r + 1) >> 1; waste = 0; limit = tot - sum[mid];
		if (dfs(mid, 1)) l = mid; else r = mid - 1;
		memcpy(a, aa, sizeof a);
	}
	printf(ot, l);
	return 0;
}


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值