首页 > 其他分享 >第 387 场周赛

第 387 场周赛

时间:2024-03-03 15:34:25浏览次数:28  
标签:周赛 nums int back ++ grid 387 push

第 387 场周赛

将元素分配到两个数组中 I

解题思路:

暴力比较放置。

代码:

class Solution {
public:
    vector<int> resultArray(vector<int>& nums) {
        vector<int> a, b;
        int n = nums.size();
        int idx = 0;
        a.push_back(nums[idx]);
        idx++;
        if (n > 1)
        {
            b.push_back(nums[idx]);
            idx++;
        }
        while (idx < n)
        {
            if (a.back() > b.back())
            {
                a.push_back(nums[idx]);
            }
            else
            {
                b.push_back(nums[idx]);
            }
            idx++;
        }
        for (auto x : b)
        {
            a.push_back(x);
        }
        return a;
    }
};

元素和小于等于 k 的子矩阵的数目

解题思路:

二维前缀和。

代码:

class Solution {
public:
    int countSubmatrices(vector<vector<int>>& grid, int k) {
        int n = grid.size();
        int m = grid[0].size();
        int cnt = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (i == 0 && j == 0)
                {

                }
                else if (i == 0)
                {
                    grid[i][j] += grid[i][j - 1];
                }
                else if (j == 0)
                {
                    grid[i][j] += grid[i - 1][j];
                }
                else
                {
                    grid[i][j] += grid[i - 1][j] + grid[i][j - 1] - grid[i - 1][j - 1];
                }
                if (grid[i][j] <= k)
                {
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

在矩阵上写出字母 Y 所需的最少操作次数

解题思路:

暴力统计。

代码:

class Solution {
public:
    int minimumOperationsToWriteY(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int> cnt1(4), cnt2(4);
        vector<vector<bool>> vis(n + 1, vector<bool>(n + 1, false));
        for (int i = 0; i < (n + 1) / 2; i++)
        {
            cnt1[grid[i][i]]++;
            vis[i][i] = true;
        }
        for (int i = n - 1; i >= (n) / 2; i--)
        {
            int y = i;
            int x = n - 1 - i;
            if (vis[x][y] == false)
            {
                cnt1[grid[x][y]]++;
                vis[x][y] = true;
            }
        }
        for (int i = n - 1; i >= (n) / 2; i--)
        {
            int x = i;
            int y = (n) / 2;
            if (vis[x][y] == false)
            {
                cnt1[grid[x][y]]++;
                vis[x][y] = true;
            }
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (vis[i][j] == false)
                {
                    vis[i][j] = true;
                    cnt2[grid[i][j]]++;
                }
            }
        }
        int ans = 1e9;
        int s1 = cnt1[0] + cnt1[1] + cnt1[2];
        int s2 = cnt2[0] + cnt2[1] + cnt2[2];
        vector<int> a(4), b(4);
        for (int i = 0; i < 3; i++)
        {
            a[i] = s1 - cnt1[i];
            b[i] = s2 - cnt2[i];
        }
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (i != j)
                {
                    ans = min(ans, a[i] + b[j]);
                }
            }
        }
        return ans;

    }
};

将元素分配到两个数组中 II

解题思路:

离散化 + 两个树状数组记录数字出现次数。

代码:

class Solution {
    const static int N = 1e5 + 10;
    const static int len = 1e5 + 1;
public:
    int tr1[N], tr2[N];
    int lowbit(int x)
    {
        return x & -x;
    }
    void add(int tr[], int idx, int x)
    {
        for (int i = idx; i <= len; i += lowbit(i))
        {
            tr[i] += x;
        }
    }
    int query(int tr[], int idx)
    {
        int res = 0;
        for (int i = idx; i > 0; i -= lowbit(i))
        {
            res += tr[i];
        }
        return res;
    }
    vector<int> resultArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> a, b;
        vector<int> v;
        for (auto x : nums)
        {
            v.push_back(x);
        }
        sort(v.begin(), v.end());
        v.erase(unique(v.begin(), v.end()), v.end());
        auto find =[&](int x)
        {
            return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
        };
        for (int i = 0; i < n; i++)
        {
            nums[i] = find(nums[i]);
        }
        a.push_back(nums[0]);
        add(tr1, nums[0], 1);
        if (n > 1)
        {
            b.push_back(nums[1]);
            add(tr2, nums[1], 1);
        }
        for (int i = 2; i < n; i++)
        {
            int cnt1 = query(tr1, len) - query(tr1, nums[i]);
            int cnt2 = query(tr2, len) - query(tr2, nums[i]);
            if (cnt1 > cnt2)
            {
                a.push_back(nums[i]);
                add(tr1, nums[i], 1);
            } 
            else if (cnt1 < cnt2)
            {
                b.push_back(nums[i]);
                add(tr2, nums[i], 1);
            }
            else 
            {
                if (a.size() < b.size())
                {
                    a.push_back(nums[i]);
                    add(tr1, nums[i], 1);
                }
                else if (a.size() > b.size())
                {
                    b.push_back(nums[i]);
                    add(tr2, nums[i], 1);
                }
                else
                {
                    a.push_back(nums[i]);
                    add(tr1, nums[i], 1);
                }
            }
        }
        for (auto x : b)
        {
            a.push_back(x);
        }
        for (int i = 0; i < n; i++)
        {
            a[i] = v[a[i] - 1];
        }
        return a;
    }
};

标签:周赛,nums,int,back,++,grid,387,push
From: https://www.cnblogs.com/value0/p/18050115

相关文章

  • 周赛Round26总结1
    预计得分500,实际得分400,挂了20+50+30分。T1移动move题目描述:\(n\)个二维向量\((X_{i},Y_{i})\),随便选择\(k\)个,其中\(0<=k<=n\),起点是\((0,0)\),每次移动后的位置是\((s+x_{i},t+y_{i})\),求终点\(|s|+|t|\)的最大值。分析:分类讨论。\((X_{i},Y_{i})\)可以分到四个......
  • 对 vCenter Server 中的性能数据间断或性能数据缺失进行故障排除 (1003878)
    SymptomsGapsinperformancedataMissingperformancedata ResolutionValidatethateachtroubleshootingstepbelowistrueforyourenvironment.Eachstepprovidesinstructionsoralinktoadocument,inordertoeliminatepossiblecausesa......
  • 牛客周赛 Round 34
    牛客周赛Round34比赛链接感觉比以往难度有些大,但是大佬们该强的还是很强啊小红的字符串生成思路就两个字符,如果字符相同只能组成两种,不同则可以组成四种Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()#de......
  • 牛客周赛34(A~E)
    A两种情况两个字符相同只有2两个字符不相同4#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definepddpair<double,double......
  • 牛客周赛 Round 34
    牛客周赛Round34小红的字符串生成代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;voidsolve()......
  • P3870 分块题解
    这篇题解有点问题(分块标记处),但现在不想修,等有空修吧link分块是一种很神奇的暴力,学了它就会觉得什么都可以用分块做。分块的主要思想就是整块快速查询,散块暴力查询。比如说,分块可以在\(O(q\sqrt{n}+n)\)的时间复杂度内解决线段树模板题。回到本题,显然我们可以用每个块维护......
  • 牛客周赛 Round 33(小白成长记)
    A.小红的单词整理思路&解法:输入两个字符串交换即可Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){stringa,b;cin>>a>>b;cout<<b<<'\n'<<a;return0;}B.小红煮汤圆思路:给你n带汤圆包袋中有m......
  • 牛客周赛 Round 32
    牛客周赛Round32小红的01背包代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;voidsolve(......
  • 牛客周赛 Round 31
    牛客周赛Round31小红小紫替换代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;voidsolve(){......
  • 牛客周赛31
    A小红小紫替换https://ac.nowcoder.com/acm/contest/74362/A这题相当于签到题只需要将kou的情况转换成yukari就行其他不变点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){stringa;cin>>a;if(a=="kou")cout<<"yukari"......