第一题,纯考矩阵运算的,并且还有优化内存的细节。
首先要在cpp里实现矩阵乘法,只需要三个循环就行,如下:
第一个循环遍历第一个矩阵的每一行,第二个循环遍历第二个矩阵的每一列,第三个循环遍历他们行列中的第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;
}
第二题,田地丈量,我暂时没想到什么好的办法,暴力枚举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又是一堆错😭还是不是很会用,所以今天也只做了两题~~
倒是周四过得蛮舒服的,难得是阴天,而且真的降了大温,不热了。早上正常刷题,中午美美睡了个觉,下午和清铉去咖啡厅自习到十点钟~~又是美好的一天呐😋
还有,我学生考试考得也很好!当老师的在这一刻成就感拉满了🥹🥹🥹
明天满课,继续加油ヾ(゚∀゚ゞ)