Gym 100490A-A - Approximation-数学

本文介绍了一种使用贪心算法解决给定序列中非递减序列问题的方法。通过分析序列的特性,提出了一个有效的算法来确定每个元素对应的一个值,确保生成的序列是非递减的且具有最小的总和。详细阐述了算法的核心思想、步骤和实现细节,包括如何在每次加入新元素时更新序列和保持非递减性质。

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=183934


题意是  给你一段随机的n个 数字ai, 请找出每个数字对应的一个b值  输出一段非递减的b【i】

使得 

最小!

首先要知道一个知识,对于一段数,要找到一个最小的s,那么只要让每一个bi=平均数即可    *

 其次,题目要求b数组是非递减的。


对于一段a[1]~a[i],设其最优平均数为ave,即b[1]~b[i]=ave;

对于a[i+1]:

如果a[i+1]=ave;那么就让b[a+1]=ave;  S不变

如果a[i+1]<ave;由(*)式可知,对a[1]~a[i],使得S最小的是ave,现在如果把a[i+1]纳入其中,必使得平均数不等于ave,那么a[1]~a[i+1]得到的S必将小于原来的最优S,我们记这部分差为S1;又b[i+1]必定为一正数S2,所以纳入a[i+1]后的S3=S+S1+S2>S   本不应该选。   但是如果不选,就是令b[i+1]=b[i+1] ,但是这样会使得B【i+1】<B[1]~B[i]  ,与题目的“非递减”  要求冲突,所以此情况下应该把a[i+1]纳入。     并且!,当a[i+1]纳入后,由上面分析可知,当前的ave会变小,因此每次纳入新元素后,得和之前的所有ave比较一次,如果他的前面有比当前ave大的b[i]值,就得把那个点 到当前点 b值替换为 那个点 到当前点的 平均数

如果a[i+1]>ave,由以上分析,令b[i+1]=b[i+1],能得到最小的S,此时 B【i+1】》B[1]~B[i]   不冲突。



其实就是  从一开始贪心,遇到非升序的数就一直纳入并把从开始到当前的位置的B值置为 纳入新数后整段的平均数。

遇到第一个非降序的字符,就以之为新起点计算

PS: 每次纳入新数后,由于ave会减小,所以需要把以前的ave都比较一遍,保证  “非递减”(当然不能for模拟..会超时..具体实现看代码 )




#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define inf 0x7f7f7f7f
using namespace std;
const int maxn = 200005;  
int min(int a,int b)
{return a<b?a:b;}
struct node 
{
	int l,r;
	double ave;
};
node ans[maxn];


int tm[maxn];
__int64 sum[maxn]; 

int main()
{
 	freopen( "approximation.in","r",stdin );  //scanf 从1.txt输入
<span style="white-space:pre">	</span>  freopen( "approximation.out","w",stdout );  //printf输出到1.tx
					 
	int n,j,i;
	cin>>n; 
	for (i=1;i<=n;i++)
	{
		scanf("%d",&tm[i]);
		sum[i]=sum[i-1]+tm[i];
	}
	int posi=0;

	for (i=1;i<=n;i++)
	{
		node tmp;
		tmp.l=tmp.r=i;
		tmp.ave=tm[i];
		while(posi!=-1)
		{
			if (tmp.ave<ans[posi].ave)
			{
				tmp.l=ans[posi].l;
				tmp.ave=((double)(sum[i]-sum[tmp.l-1]))/((double)(i-tmp.l+1));
				posi--;
			}
			else
				break; 
		} 
		ans[++posi]=tmp;
	} 

	for (i=1;i<=posi;i++)
	{	
		for (j=ans[i].l;j<=ans[i].r;j++)
		{
				printf("%.9lf ",ans[i].ave);
		}
	}
	
	printf("\n");
	
	return 0;
} 


内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值