AcWing第61场周赛+Leetcode第303场单周赛+第83场双周赛补题

AcWing第61场周赛

第一题AcWing 4497. 分糖果

分析:因为涉及到10^{^{16}}数量级,所以在初定义的时候一定要用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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值