9.12刷题(矩阵运算,田地丈量)

1e91301d64a34d4daf1f93407aec7731.png

第一题,纯考矩阵运算的,并且还有优化内存的细节。

首先要在cpp里实现矩阵乘法,只需要三个循环就行,如下:53a6024fd2714da38b1b13185f4f455c.png

第一个循环遍历第一个矩阵的每一行,第二个循环遍历第二个矩阵的每一列,第三个循环遍历他们行列中的第n个数,最后sum+=的数组脚标不要写错了。

优化内存的话就是不要按照题目所给的计算顺序去计算,因为这样会产生n*n的矩阵,导致内存不够(本题n比d要大得多),所以需要交换一下计算次序,让后两个矩阵先相乘,得到d*d的矩阵,这样就能使用较小的内存了。

最后代码如下:

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
ll n,d;
int main()
{   	
	cin>>n>>d;
	ll w[n+1]={0},q[n+1][d+1]={0},K[d+1][n+1]={0},v[n+1][d+1]={0};
	for(ll i=0;i<n;i++)
	{
		for(ll j=0;j<d;j++)
		cin>>q[i][j];
	}
	for(ll j=0;j<n;j++)
	{
		for(ll i=0;i<d;i++)
		cin>>K[i][j];
	}
	for(ll i=0;i<n;i++)
	{
		for(ll j=0;j<d;j++)
		cin>>v[i][j];
	}
	for(ll i=0;i<n;i++)
	cin>>w[i];
	ll r[d][d];
	for(int i=0;i<d;i++)//遍历A的每一行
	{
		for(int j=0;j<d;j++)//遍历b的每一列
		{
			ll sum=0;
			for (int k=0;k<n;k++)//第k个元素相乘
			{
				sum+=K[i][k]*v[k][j];
			}
			r[i][j]=sum;
		}
	}
	ll r2[n][d];
	for(int i=0;i<n;i++)//遍历A的每一行
	{
		for(int j=0;j<d;j++)//遍历b的每一列
		{
			ll sum=0;
			for (int k=0;k<d;k++)//第k个元素相乘
			{
				sum+=q[i][k]*r[k][j];
			}
			r2[i][j]=sum;
		}
	}
	ll ans[n][d];
	for(int i=0;i<n;i++)//遍历w中的每个元素
	{
		for(int j=0;j<d;j++)
		ans[i][j]=w[i]*r2[i][j];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<d;j++)
		cout<<ans[i][j]<<' ';
		cout<<'\n';
	}
	return 0;
}	


93d719fab4cd4f328644d4264db94f00.png

第二题,田地丈量,我暂时没想到什么好的办法,暴力枚举16种情况直接过了。代码如下:

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
ll n,a,b,ans;
int main()
{   	
	cin>>n>>a>>b;
	while(n--)
	{
		ll x1,x2,y1,y2;
		cin>>x1>>y1>>x2>>y2;
		if(x1>=0&&x1<=a&&y1>=0&&y1<=b)//左下角的点在矩形内
		{
			if(x2<=a&&y2>b)
			ans+=(x2-x1)*(b-y1);
			else if(x2>a&&y2>b)
			ans+=(a-x1)*(b-y1);
			else if(x2>a&&y2<=b)
			ans+=(a-x1)*(y2-y1);
			else
			ans+=(x2-x1)*(y2-y1);
			
		}
		else if(x2>=0&&x2<=a&&y2>=0&&y2<=b)//右上角的点在矩形内
		{
			if(x1<=0&&y1<=0)
			ans+=x2*y2;
			else if(x1<=0&&y1>0)
			ans+=x2*(y2-y1);
			else if(x1>0&&y1<=0)
			ans+=(x2-x1)*y2;
			else
			ans+=(x2-x1)*(y2-y1);
			
		}
		else if(x1>=0&&x1<=a&&y2>=0&&y2<=b)//左上角的点在矩形内
		{
			if(x2>a&&y1<=0)
			{
				ans+=(a-x1)*y2;
			}
			else if(x2>a&&y1>0)
			ans+=(a-x2)*(y2-y1);
			else if(x2<=a&&y1<0)
			ans+=(x2-x1)*y2;
			else
			ans+=(x2-x1)*(y2-y1);
			
		}
		else if(x2>=0&&x2<=a&&y1>=0&&y1<=b)//右下角的点在矩形内
		{
			if(x1<=0&&y2>b)
			ans+=x2*(b-y1);
			else if(x1<=0&&y2<=b)
			ans+=x2*(y2-y1);
			else if(x1>0&&y2>b)
			ans+=(x2-x1)*(b-y1);
			else
			ans+=(x2-x1)*(y2-y1);
			
		}
	}
	cout<<ans;
	return 0;
}	


今天就只做了这两题,第三题的话用vector又是一堆错😭还是不是很会用,所以今天也只做了两题~~

倒是周四过得蛮舒服的,难得是阴天,而且真的降了大温,不热了。早上正常刷题,中午美美睡了个觉,下午和清铉去咖啡厅自习到十点钟~~又是美好的一天呐😋

还有,我学生考试考得也很好!当老师的在这一刻成就感拉满了🥹🥹🥹

明天满课,继续加油ヾ(゚∀゚ゞ)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值