leetcode :
第一题https://leetcode.cn/problems/check-if-matrix-is-x-matrix/其实这题就是纯模拟,比赛时候想复杂了一点
class Solution {
public:
bool checkXMatrix(vector<vector<int>>& grid) {
int n = grid.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j || i + j == n - 1) {
if (grid[i][j] == 0) {
return false;
}
} else if (grid[i][j] != 0) {
return false;
}
}
}
return true;
}
};
第二题https://leetcode.cn/problems/count-number-of-ways-to-place-houses/动态规划,题目是求两侧,而两侧是相互独立的,所以先求一侧的方案数。
dp[ i ][ 0 ], 第 i 位置不放房间的方案数;
dp[ i ][ 1 ], 第 i 位置放置房间的方案数;
转移方程,
dp[ i ][ 0 ] = dp[ i-1 ][ 0 ] + dp[ i-1 ][ 1 ];
dp[ i ][ 1 ] = dp[ i-1 ][ 0 ];
class Solution {
public:
const int MOD = 1e9+7;
int countHousePlacements(int n) {
long dp[n][2];
dp[0][0] = 1;
dp[0][1] = 1;
for (int i = 1; i < n; i++) {
dp[i][0] = (dp[i-1][0] + dp[i-1][1]) % MOD;
dp[i][1] = dp[i-1][0] % MOD;
}
long ans = dp[n - 1][0] + dp[n - 1][1]; /* 两侧的放置互不影响 */
return ans * ans % MOD;
}
};
第三题https://leetcode.cn/problems/maximum-score-of-spliced-array/ 滑动窗口,
记录改变一个窗口对原数组的增益,只要 ans >= 0 ,就有可能产生最优解,可以继续下去
如果 ans < 0 ,说明已经找过的部分产生了负面效果,应当舍弃,此时找到第一个使 ans >= 0 的位置继续查找
由于nums1和nums2都可能为基,我们要查找两次
class Solution {
public:
int maximumsSplicedArray(vector<int>& nums1, vector<int>& nums2) {
return max(pan(nums1, nums2), pan(nums2, nums1));
}
int pan(vector<int>& nums1, vector<int>& nums2){
int sum = 0;
int ans = 0;
int zhon = 0;
for(int i = 0; i < nums1.size(); i++){
sum += nums1[i];
ans = max(ans + nums2[i] - nums1[i], 0);
zhon = max(zhon, ans);
}
return zhon + sum;
}
};
acwing :
第一题https://www.acwing.com/problem/content/4488/
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int sum = 0;
for(int i = 0; i < n; i ++){
int x;
cin >> x;
sum += x;
}
int sum1 = 0;
for(int i = 0; i < n; i ++){
int x;
cin >> x;
sum1 += x;
}
if(sum >= sum1){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}
第二题https://www.acwing.com/problem/content/4489/统计其质数的个数,将质数个数的最大次数加至为2的指数
若质数的个数均为最大次数,则不需要进行操作1
将最大次数进行右移操作,到1时表示到达最小值
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int ans = 1, m = 0;
vector<int> aa;
for (int i = 2; i * i <= n; i ++ ){
if (n % i == 0){
int x = 0;
while (n % i == 0){
n /= i, x ++ ;
}
ans *= i;
aa.push_back(x);
while (1 << m < x){
m ++ ;
}
}
}
if (n > 1){
ans *= n;
aa.push_back(1);
while (1 << m < 1) m ++ ;
}
for (auto x: aa){
if (x < 1 << m){
m ++ ;
break;
}
}
cout << ans << ' ' << m << endl;
return 0;
}