AcWing第61场周赛
第一题:AcWing 4497. 分糖果
分析:因为涉及到数量级,所以在初定义的时候一定要用long long int来定义a,b,c;
代码:
#include<iostream>
using namespace std;
typedef long long LL;
int t;
LL a,b,c;
int main(){
cin >> t;
while(t --){
cin >> a >> b >> c;
//scanf("%lld%lld%lld",&a,&b,&c);
cout << (a + b + c) / 2 << endl;
//printf("%lld\n",(a + b + c) / 2);
}
return 0;
}
第二题:AcWing 4498. 指针
分析:由于本题数的范围比较小,可以直接进行暴力二进制枚举,如果二进制数第i位为1则代表是顺时针,那么当前角度就加上a[i],相反地如果第i位为0则代表逆时针,那么就减去角度a[I],当最后s除以360的余数为0则输出"YES".
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> a[i];
bool res = false;
for (int i = 0; i < 1 << n; i ++ )
{
int s = 0;//当前角度
for (int j = 0; j < n; j ++ )
if (i >> j & 1)
s += a[j];
else
s -= a[j];
if (s % 360 == 0)
{
res = true;
break;
}
}
if (res) puts("YES");
else puts("NO");
return 0;
}
Leetcode第303场周赛
第一题:2351. 第一个出现两次的字母
分析:定义一个整型数组用来存放每个字母出现的次数,遍历数组,每出现一次该字符就将他所对应的整数加一,当某字符出现次数达到两次时就返回他所对应的下标i,最后返回该字符。
代码:
class Solution {
public:
int a[27];
char repeatedCharacter(string s) {
for(auto i : s)
{
a[i - 'a'] ++;
if(a[i - 'a'] >= 2) return i;
}
return 'a';
}
};
第二题:2352. 相等行列对
分析:本题数据量不大,n只能取到200,可以直接嵌套三个循环暴力解决。
代码:
class Solution {
public:
int equalPairs(vector<vector<int>>& grid) {
int n = grid.size(),cnt = 0;
for(int i = 0; i < n; i ++)//遍历每一行
{
for(int j = 0; j < n; j ++)//遍历每一列
{
for(int k = 0 ; k < n; k ++)
{
if(grid[i][k] == grid[k][j])
{
if(k == n - 1)cnt ++;
continue;
}
else break;
}
}
}return cnt;
}
};
Leetcode第83场双周赛
第一题:2347. 最好的扑克手牌
分析:先初始化数组,因为是最小的手牌是high card,所以可以将所有的结果按照顺序保存为一个字符串数组,然后再按照下标读取。因为数字牌是从1-13,所以在遍历ranks数组的时候只需统计ranks数组中的值出现的次数。之后再看花色,将每一个i与第一个花色对比,如果所有的花色都相同,那么就是同花。
代码:
class Solution {
public:
string bestHand(vector<int>& ranks, vector<char>& suits) {
int cnt[15] = {0};
int t = 0;
string ans[4] = {"High Card","Pair","Three of a Kind","Flush"};
for(int i = 0;i < 5;i ++){
cnt[ranks[i]] ++;
if(cnt[ranks[i]] == 2 && t == 0)t = 1;
else if(cnt[ranks[i]] == 3 && t != 0)t = 2;
}
int sum = 0;
for(int i = 0;i < 5;i ++){
if(suits[i] == suits[0])sum ++;
else break;
}
if(sum == 5)t = 3;
return ans[t];
}
};
第二题:2348. 全 0 子数组的数目
分析:每次找到连续的0的个数,可以发现一个公式,0可以组成的数组的数目是(len+1)*len / 2;遍历数组中的元素,每个0子数组按照上面的式子计算相加即可求解。
代码:
class Solution {
public:
long long zeroFilledSubarray(vector<int>& nums) {
long long int res = 0;
for(int i = 0;i < nums.size();){
if(nums[i] == 0){
int j = i + 1;
while(j < nums.size() && nums[j] == 0)++ j;
long long int len = j - i;
res += (len + 1) * len / 2;
i = j;
}else{
++ i;
}
}
return res;
}
};