文章目錄
- 前言
- 第一題
- 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= ?200?030?004? ?
計算其行列式:
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;
}