AcWing第61场周赛
1.分糖果
感觉没什么技术含量,照着做就好了,但要注意值的范围
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
long long a[N][3];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < 3; j ++ )
scanf("%ld",&a[i][j]);
}
for (int i = 0; i < n; i ++ )
{
long long sum;
sum=(a[i][0]+a[i][1]+a[i][2])/2;
printf("%ld",sum);
cout << endl;
}
return 0;
}
然后我看了一下题解🤯,我的第一个明显太杂了,优化一下其实不要多少代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,i;
cin>>n;
while(n--){
long long a,b,c;
cin>>a>>b>>c;
cout<<(a+b+c)/2<<'\n';
}
}
附上题解大佬的一句劝诫🌹
2.《指 针》
很抽象的一个题,大概意思是给定次数和没次的角度,通过顺时针或逆时针,看最后指针能否回到0(达到360的倍数即可)
采用二进制枚举的方法,遇到1就+,遇到0就减,最后看被处理数能不能整除360就完事了👌
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 30;
int a[N];
int n,res;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ )
cin >> a[i];
for(int i = 0; i <1 << n ; i ++ )
{
res = 0;
for(int j = 0; j < n; j ++ )
{
if((1 << j) & i)
res += a[j];
else
res -= a[j];
}
if(res % 360 == 0)
{
cout << "YES" << endl;
return 0;
}
}
cout << "NO" << endl;
return 0;
}
力扣第303场周赛
1.第一次出现两次的字母
构造一个map<char,int> mp,然后将s里的字母在mp里计算出现次数,只要遇到出现2次的字母就返回,可能就考察哈希表吧😂
class Solution {
public:
char repeatedCharacter(string s) {
map<char,int> mp;
int n=s.length();
for(int i=0;i<n;i++)
{
mp[s[i]]++;
if(mp[s[i]]==2) return s[i];
}
return 0;
}
};
2.相等行列对
看到一个超级巧妙的方法🤯
构造一个新矩阵,然后将原矩阵转置存入新矩阵,再用新矩阵和原矩阵比较就可以找到题目所要求的行列相等对
class Solution {
public:
int equalPairs(vector<vector<int>>& grid) {
int ans = 0;
vector<vector<int>> grid2(grid.size(), vector<int>(grid.size()));
for (int i = 0; i < grid.size(); i++)
for (int j = 0; j < grid.size(); j++)
grid2[i][j] = grid[j][i];
for (int i = 0; i < grid.size(); i++)
for (int j = 0; j < grid.size(); j++)
if (grid[i] == grid2[j])
ans++;
return ans;
}
};
有一说一这太酷了