【得物】20250419笔试算法题
文章目录
- 前言
- 第一题
- 1. 题目描述
- 2. 思路解析
- 3. AC代码
- 第二题
- 1. 题目描述
- 2. 思路解析
- 3. AC代码
- 第三题
- 1. 题目描述
- 2. 思路解析
- 3. AC代码
前言
三道题目都比较简单,大家都可以试着做一下。
第一题
1. 题目描述
题目链接:矩阵变换
2. 思路解析
按题目要求是要输入多行字符串,但输入归输入,怎么存是我们的事情。
所以我选择把每一行都拼接到一起,形成一个字符串,然后对这一个字符串进行处理。
比如用例输入1中输入
abc
edf
ghi
我选择用string str=abcedfghi
后面输入1 1 1表示移动一个元素,然后输出移动之后处于第一行第一列的字符
移动一个元素之后str变成了bcedfghia,计算一下第一行第一列的字符下标位于str的哪里即可。
这里要提前a%=m*n;
,减少计算,比如一共8个元素,要你转移81遍,实际上,移动81遍和移动1遍最后形成的字符串是一样的。
3. AC代码
#include <bits/stdc++.h>
using namespace std;int main(){int n,m,q;cin>>n>>m>>q;string str;for(int i=0;i<n;i++){string tmp;cin>>tmp;str+=tmp;}while(q--){int a,b,c;cin>>a>>b>>c;int sum=0;a%=m*n;string tmp;for(int i=a;i<str.size();i++) tmp+=str[i];for(int i=0;i<a;i++) tmp+=str[i];cout<<tmp[(b-1)*m+c-1]<<endl;}return 0;
}
第二题
1. 题目描述
题目链接:小牛的数组置零
2. 思路解析
这里题目的意思就是每次会给定你一个数组,数组里有N个元素,你每次可以同时选任意个数组元素减去2k(k>=0),问你最少的操作多少次,最终使数组中的所有元素都恰好等于0。
这里一看到每次减去2的k次方,我想到了二进制的每一位不就表示2k嘛,比如10用二进制表示就是1010
让10变成0只需要减去一个23和21就行,所以一共需要两次。
那么如果数组中有两个元素10、6呢
我们把是的二进制和6的二进制放一起看看:
1010
0110
我们可以发现在21这一列10和6都是1,所以在删除的时候可以一起删去,但是其其它位置上就不能同时删去了,所以10要单独删一次23、6要单独删一次22,最终一共需要删除3次。
所以我们可以得到规律,我们可以把数组中的数化为二进制,然后全部做或运算
,最后统计二进制中1的个数即可。
统计1的个数直接用C++中bitset里的count进行统计即可。
为了防止溢出,我bitset直接设置了32位。
有关与bitset的使用,大家如果不了解,可以去看一下我的这一篇文章:C++ bitset(位图)的介绍和使用
3. AC代码
#include <bits/stdc++.h>
using namespace std;int main(){int t;cin>>t;while(t--){int n;cin>>n;int sum=0;for(int i=0;i<n;i++){int number;cin>>number;sum|=number;}bitset<32> bit(sum);sum=bit.count();cout<<sum<<endl;}return 0;
}
第三题
1. 题目描述
题目链接:小牛的行列式构造
2. 思路解析
本题比较简单,就让构造一个三阶矩阵,让矩阵的值算出来是给定的值x即可,我们直接让其对角线是x、1、1其他位置位0,这样矩阵的值就是x11,就是x了。
直接利用cout进行输出即可。
附:
计算方法
对于一个 n × n n \times n n×n 的对角矩阵 A A A,其对角线元素为 a 11 , a 22 , … , a n n a_{11}, a_{22}, \ldots, a_{nn} a11,a22,…,ann,则行列式 det ( A ) \text{det}(A) det(A) 为:
det ( A ) = a 11 ⋅ a 22 ⋅ … ⋅ a n n \text{det}(A) = a_{11} \cdot a_{22} \cdot \ldots \cdot a_{nn} det(A)=a11⋅a22⋅…⋅ann
例子
假设有一个 3 × 3 3 \times 3 3×3 的对角矩阵 A A A:
A = [ 2 0 0 0 3 0 0 0 4 ] A = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 4 \end{bmatrix} A= 200030004
计算其行列式:
det ( A ) = 2 × 3 × 4 = 24 \text{det}(A) = 2 \times 3 \times 4 = 24 det(A)=2×3×4=24
总结
- 对角矩阵的行列式:等于对角线元素的乘积。
- 计算步骤:将所有对角线元素相乘。
这个方法适用于任意大小的对角矩阵,计算过程简单且高效。
3. AC代码
#include <bits/stdc++.h>using namespace std;int main(){int n;cin>>n;cout<<n<<" 0"<<" 0"<<endl;cout<<"0 "<<"1"<<" 0"<<endl;cout<<"0"<<" 0"<<" 1"<<endl;return 0;
}