1433.【例题1】愤怒的牛

信息学奥赛一本通 二分查找

【题目描述】

农夫 John 建造了一座很长的畜栏,它包括N(2≤N≤100,000)隔间,这些小隔间依次编号为x1,...,xN(0≤xi≤1,000,000,000). 但是,John的C(2≤C≤N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢

【输入】

第一行:空格分隔的两个整数N和C;

第二行---第N+1行:i+1行指出了xi的位置。

【输出】

一个整数,最大的最小值。

【输入样例】

5 3
1 2 8 4 9

【输出样例】

3

【提示】

把牛放在1,4,8这样最小距离是3。

【分析】

先将奶牛仓按编号升序排列好,例子中排好是1 2 4 8 9,把奶牛放1 4 8里,这样最大间隔是3。注意这里的最大间隔是仓编号的间隔,并不是仓位置的间隔。例如把例子的仓编号修改为5 9 104 240 255,则最大间隔是99。

在最小间隔与最大编号的范围内找合适的值,尝试安排奶牛。最小间隔初始值取1,最大间隔初始值为最大的一个编号。采用二分查找能够较快得到答案。

#include <bits/stdc++.h>
int num[100005];
using namespace std;
int main(int argc, char *argv[]) {
	int n,c;
	cin >> n >> c;
	for(int i = 0; i < n; i++){
		cin >> num[i];
	}
	sort(num, num + n);
	//二分查找
	int left = 1; //初始最小间隔
	int right = num[n-1]; //初始最大间隔
	while(left <= right){
		//取中位数
		int mid =  (right + left) / 2;
		//pre 记录了安排奶牛的仓位置
		int pre = 0,cnt = 1;
		for(int i = 0; i < n; i++){
			//当后一个仓编号 - 前一个安排奶牛的仓编号 >= 间隔,说明符合要求,可以安排奶牛
			if(num[i] - num[pre] >= mid){
				cnt++;
				pre = i;//更新位置
			}
			//奶牛已经安排完,跳出循环
			if(cnt >= c){
				break;
			}
		}
		//当前间隔情况下,如果奶牛可以安排完,则说明可以将间隔调大;如果无法安排,则需要将间隔调小。
		if(cnt >= c){
			left = mid + 1;
		}else{
			right = mid -1;
		}
	}
	//输出
	cout << right;
	return 0;
}

电力系统潮流计算是电力系统分析中的核心问题之一,顿-拉夫森法(Newton-Raphson Method)因其收敛速度快、精度高而被广泛应用于求解非线性潮流方程。该方法通过将非线性方程组转化为一系列线性方程组进行迭代求解[^1]。 ### 问题描述 假设有一个简单的3节点电力系统,其中节点1为平衡节点(Slack Bus),节点2为PV节点(电压幅值和有功功率已知),节点3为PQ节点(有功和无功功率已知)。系统的导纳矩阵已知,目标是通过顿-拉夫森法计算各节点的电压幅值和相角。 ### MATLAB实现步骤 1. 初始化节点数据:包括节点类型、注入功率、初始电压估计等。 2. 构造导纳矩阵。 3. 计算功率不平衡量。 4. 构建雅可比矩阵(Jacobian Matrix)。 5. 求解修正方程并更新电压相角和幅值。 6. 判断是否收敛,若未收敛则重复步骤3~5。 以下是一个简化的MATLAB代码示例: ```matlab % 定义节点数量 nbus = 3; % 初始电压估计(幅值和相角) V = [1.05; 1.02; 1.0]; % 幅值 theta = [0; 0; 0]; % 相角 % 节点注入功率(P: MW, Q: MVar) P = [0; 0.5; -0.8]; % 有功功率 Q = [0; 0; -0.6]; % 无功功率 % 导纳矩阵(简化为极坐标形式) Y = [complex(0.98, -0.1) complex(-0.5, 0.2) complex(-0.4, 0.3); complex(-0.5, 0.2) complex(1.2, -0.3) complex(-0.7, 0.1); complex(-0.4, 0.3) complex(-0.7, 0.1) complex(1.1, -0.4)]; tolerance = 1e-6; max_iter = 10; for iter = 1:max_iter % 计算功率不匹配 S = V .* (Y * (V .* exp(1i*theta))); delta_P = P - real(S); delta_Q = Q - imag(S); % 构建雅可比矩阵 J = zeros(2*nbus, 2*nbus); for i = 1:nbus for j = 1:nbus if i ~= j G = real(Y(i,j)); B = imag(Y(i,j)); J(i,j) = -V(i)*V(j)*(G*sin(theta(i)-theta(j)) - B*cos(theta(i)-theta(j))); J(i,j+nbus) = V(i)*V(j)*(G*cos(theta(i)-theta(j)) + B*sin(theta(i)-theta(j))); J(i+nbus,j) = -V(i]*V[j]*(G*cos(theta[i]-theta[j]) + B*sin(theta[i]-theta[j])); J(i+nbus,j+nbus) = -V(i)*V(j)*(G*sin(theta(i)-theta(j)) - B*cos(theta(i)-theta(j))); end end end % 解修正方程 mismatch = [delta_P; delta_Q]; dx = J \ mismatch; % 更新变量 theta = theta + dx(1:nbus); V = V + dx(nbus+1:end); % 检查收敛条件 if norm(mismatch) < tolerance break; end end % 输出结果 disp('节点电压幅值:'); disp(V); disp('节点电压相角:'); disp(theta); ``` ### 收敛性与注意事项 - 顿-拉夫森法对初值敏感,通常选择平启动(Flat Start)即所有节点电压幅值设为1.0,相角为0。 - 雅可比矩阵在每次迭代中都需要重新计算,确保其准确性。 - 对于大规模系统,可以采用稀疏矩阵技术优化内存使用和计算效率[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值