Acwing66周赛+Leetcode308周赛

Acwing66周赛+Leetcode308周赛

ACW

link题目链接

这次的周赛又划水了 ,是真的划水了 hhh
去湖州漂流hh

第二题字母补齐
简单而言就是构造一个hash表,遍历string 。。。

第三题

给定一个包含 n 个整数 s1,s2,…,sn 的集合 S。

我们规定,如果某个整数在一个集合中恰好出现一次,则称该整数为超级数。

例如,集合 {1,1,2,3,3,3,4} 中包含两个超级数 2,4。

现在,请你将 S 分成两个集合 A 和 B(其中一个可以为空),使得集合 A 中超级数的数量与集合 B 中超级数的数量相同(也就是说,集合 A 中恰好出现一次的整数的数量与集合 B 中恰好出现一次的整数的数量相同)。

输入格式
第一行包含一个整数 n。

第二行包含 n 个整数 s1,s2,…,sn。

输出格式
如果不存在合理的划分方案,则输出一行 NO。

否则,第一行输出 YES,第二行输出一个长度为 n 的由 A 和 B 构成的字符串,其中的第 i 个字符,如果为 A 则表示 si 划分到集合 A,如果为 B 则表示 si 划分到集合 B。

如果方案不唯一,输出任意合理方案均可。

数据范围
前 6 个测试点满足 2≤n≤12。
所有测试点满足 2≤n≤100,1≤si≤100。

输入样例1:
4
3 5 7 1
输出样例1:
YES
BABA
输入样例2:
3
3 5 1
输出样例2:
NO

我们构造一个vector p;
对于数字1 p[1].push_back() 记录存在的位置
我们首先直接计算出超级数的个数 cnt
若cnt 为偶数 可以直接操作
若cnt 为奇数 我们对非超级数进行如下处理
1.当此数字出现次数为2时 我们发现无论放在a中还是b中对结果没有影响
2.当此数字出现次数大于2时,我们只需要将一个数字放在a中,其余数字均放入b 此时可以呈现a中超级数比b中多1
3.如果剩下的数字均不大于2,可得无解
实现代码如下

#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 110;

int n;
vector<int> p[N];

int main()
{
    cin >> n;

    for (int i = 0; i < n; i ++ )
    {
        int x;
        cin >> x;
        p[x].push_back(i);
    }

    int cnt = 0;
    for (int i = 0; i < N; i ++ )
        if (p[i].size() == 1)
            cnt ++ ;

    string res(n, 'A');
    for (int i = 0, k = 0; i < N; i ++ )
        if (p[i].size() == 1)
        {
            k ++ ;
            if (k <= cnt / 2) res[p[i][0]] = 'A';
            else res[p[i][0]] = 'B';
        }

    bool flag = true;
    if (cnt % 2)
    {
        flag = false;
        for (int i = 0; i < N; i ++ )
            if (p[i].size() > 2)
            {
                flag = true;
                res[p[i][0]] = 'A';
                for (int j = 1; j < p[i].size(); j ++ )
                    res[p[i][j]] = 'B';
                break;
            }
    }

    if (flag)
    {
        puts("YES");
        cout << res << endl;
    }
    else puts("NO");

    return 0;
}

Leetcode

link原题链接
前三题均可暴力ac

给你一个 正 整数 k ,同时给你:

一个大小为 n 的二维整数数组 rowConditions ,其中 rowConditions[i] = [abovei, belowi] 和
一个大小为 m 的二维整数数组 colConditions ,其中 colConditions[i] = [lefti, righti] 。
两个数组里的整数都是 1 到 k 之间的数字。

你需要构造一个 k x k 的矩阵,1 到 k 每个数字需要 恰好出现一次 。剩余的数字都是 0 。

矩阵还需要满足以下条件:

对于所有 0 到 n - 1 之间的下标 i ,数字 abovei 所在的 行 必须在数字 belowi 所在行的上面。
对于所有 0 到 m - 1 之间的下标 i ,数字 lefti 所在的 列 必须在数字 righti 所在列的左边。
返回满足上述要求的 任意 矩阵。如果不存在答案,返回一个空的矩阵。

 

示例 1:



输入:k = 3, rowConditions = [[1,2],[3,2]], colConditions = [[2,1],[3,2]]
输出:[[3,0,0],[0,0,1],[0,2,0]]
解释:上图为一个符合所有条件的矩阵。
行要求如下:
- 数字 1 在第 1 行,数字 2 在第 2 行,1 在 2 的上面。
- 数字 3 在第 0 行,数字 2 在第 2 行,3 在 2 的上面。
列要求如下:
- 数字 2 在第 1 列,数字 1 在第 2 列,2 在 1 的左边。
- 数字 3 在第 0 列,数字 2 在第 1 列,3 在 2 的左边。
注意,可能有多种正确的答案。
示例 2:

输入:k = 3, rowConditions = [[1,2],[2,3],[3,1],[2,3]], colConditions = [[2,1]]
输出:[]
解释:由前两个条件可以得到 3 在 1 的下面,但第三个条件是 3 在 1 的上面。
没有符合条件的矩阵存在,所以我们返回空矩阵。
 

提示:

2 <= k <= 400
1 <= rowConditions.length, colConditions.length <= 104
rowConditions[i].length == colConditions[i].length == 2
1 <= abovei, belowi, lefti, righti <= k
abovei != belowi
lefti != righti

我们首先可以观察到上下的位置和左右的位置是无关的,
对此我们可以很容易观察对于上下位置和左右位置均可进行一次top-sort()
如果出现环即可说明无解
求出上下位置的top-sort后 对于左右位置,只需按需插入即可


给定条件下构造矩阵
提交记录
51 / 53 个通过测试用例
状态:通过
执行用时: 116 ms
内存消耗: 54.9 MB
提交时间:2 天前
执行用时分布图表
执行消耗内存分布图表
邀请好友来挑战 给定条件下构造矩阵
提交的代码: 2 天前
语言: cpp

添加备注



class Solution {
    vector<int> topo_sort(int k, vector<vector<int>> &edges) {
        vector<vector<int>> g(k);
        vector<int> in_deg(k);
        for (auto &e : edges) {
            int x = e[0] - 1, y = e[1] - 1; // 顶点编号从 0 开始,方便计算
            g[x].push_back(y);
            ++in_deg[y];
        }

        vector<int> order;
        queue<int> q;
        for (int i = 0; i < k; ++i)
            if (in_deg[i] == 0)
                q.push(i);
        while (!q.empty()) {
            int x = q.front();
            q.pop();
            order.push_back(x);
            for (int y : g[x])
                if (--in_deg[y] == 0)
                    q.push(y);
        }
        return order;
    }

public:
    vector<vector<int>> buildMatrix(int k, vector<vector<int>> &rowConditions, vector<vector<int>> &colConditions) {
        auto row = topo_sort(k, rowConditions), col = topo_sort(k, colConditions);
        if (row.size() < k || col.size() < k) return {};
        vector<int> pos(k);
        for (int i = 0; i < k; ++i)
            pos[col[i]] = i;
        vector<vector<int>> ans(k, vector<int>(k));
        for (int i = 0; i < k; ++i)
            ans[i][pos[row[i]]] = row[i] + 1;
        return ans;
    }
};


这次周三相较于之前简单很多hhh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值