程序设计思维与实践 Week12 作业

本文详细解析了三道算法竞赛题目,包括寻找众数、三维迷宫最短路径及最大子序列和问题。通过深入浅出的讲解,提供了解题思路与优化策略,适合算法学习者和竞赛选手参考。

A - 必做题 - 1
在这里插入图片描述解题思路

  • 因为最后答案唯一,只需要找到出现次数最多的数即可
  • 每次输入一个数a(不需要用数组!用一个变量即可),用数组cnt[a]统计a出现的次数,每次记录max(cnt)和对应的数,最后输出即可。

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int a,cnt[1000000];
int main()
{
	
int n;
while(cin>>n)
{
memset(cnt,0,sizeof(cnt));
int Max=0;
int pos;
for(int i=0;i<n;i++)
	{cin>>a;
	cnt[a]++;
	if(cnt[a]>Max)
		Max=cnt[a],pos=a;
	}
cout<<pos<<endl;
}


}

B - 必做题 - 2
在这里插入图片描述
在这里插入图片描述解题思路

  • 用一个三维数组存储各个位置。
  • 从起始位置开始,bfs,每次向上下左右前后移动,长度+1即可。
  • 到达终点则return,记录长度;如果队列空了还没到,则无法到达。
  • 按要求输出即可。

完整代码

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char a[31][31][31];
int leng,flag;
int si,sj,sk;//起始点 
int ei,ej,ek;//终点 
int L,R,C;
int reach[31][31][31];

struct nod
{
int x;
int y;
int z;
int len;
};

bool judge(int x,int y,int z)
{
if(x>=0&&x<L&&y>=0&&y<R&&z>=0&&z<C&&reach[x][y][z]==0&&a[x][y][z]!='#')
    {  return 1;
    }else return 0;

} 
queue<nod> q;

6void bfs()
{
	while(!q.empty())
		q.pop();
	nod m,mm,e;
	m.x=si,m.y=sj,m.z=sk,m.z=0;
	e.x=ei,e.y=ej,e.z=ek;
	q.push(m);
	while(!q.empty())
	{
	m=q.front();
	q.pop();
	if(m.x==e.x&&m.y==e.y&&m.z==e.z)
		{leng=m.len;flag=1;return;}
//	if(reach[m.x][m.y][m.z]==1||a[m.x][m.y][m.z]=='#')
//		continue;
	reach[m.x][m.y][m.z]=1;
	//cout<<m.x<<" "<<m.y<<" "<<m.z<<endl;
	
	if(judge(m.x+1,m.y,m.z))
	mm=m,mm.x++,mm.len++,q.push(mm);
	
	if(judge(m.x-1,m.y,m.z))
	mm=m,mm.x--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y-1,m.z))
	mm=m,mm.y--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y,m.z-1))
	mm=m,mm.z--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y+1,m.z))
	mm=m,mm.y++,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y,m.z+1))
	mm=m,mm.z++,mm.len++,q.push(mm);
	}


		


}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>L>>R>>C)
{
	if(L==0&&R==0&&C==0)
		return 0;
	memset(a,0,sizeof(a));
	memset(reach,0,sizeof(reach));
	flag=0;
	for(int i=0;i<L;i++)
		for(int j=0;j<R;j++)
			for(int k=0;k<C;k++)
				{cin>>a[i][j][k]; 
				if(a[i][j][k]=='S')
					si=i,sj=j,sk=k;
				if(a[i][j][k]=='E')
					ei=i,ej=j,ek=k;
				}
	leng=0;
	bfs();
	if(flag==1)
		cout<<"Escaped in "<<leng<<" minute(s)."<<endl;
	else
		cout<<"Trapped!"<<endl;
}
/*
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E
*/
}

C - 必做题 - 3

在这里插入图片描述
解题思路

  • 令dp[i][j]表示 前l个数 取i段所能得到的最大的段之和,则对于dp[i][l],可以是将第l个数加入前一个段,也可以让他成为一个新的段;
  • 即dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][k]+a[j]),
  • 但数据量较大,要进行优化
  • 观察可以发现,dp[i-1][k]可以由上一次循环得到;当前状态dp[i][j]只与dp[i][j-]和max(dp[i-1][j])有关。每次记录max(dp[i-1][j]),即可转为一维

完整代码

#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int a[1000010],d[1000010],fm[1000010];
int main()
{
	std::ios::sync_with_stdio(false);
	int m,n;
	while(cin>>m>>n)
	{
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int ans=0;
		d[0]=0;
		memset(fm,0,sizeof(fm));
		memset(d,0,sizeof(d)); 
		for(int i=1;i<=m;i++)
		{
			ans=-327690000;
			for(int j=i;j<=n;j++)
			{
				d[j]=max(d[j-1]+a[j],fm[j-1]+a[j]);
				fm[j-1]=ans;
				ans=max(ans,d[j]);
			}
		}
		cout<<ans<<endl;
	}
}

【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持和技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值