题目传送门

题目概述:在每个样例中,给出一个n和k分别代表数组的长度和目标值,要求创建一个长度为n的数组,使得a1|a2|a3|a4...|an=k,同时整个数组的MEX最大

思路:从0开始依次顺次递增添加每个数字,枚举范围为(0-n-2)用一个临时数temp来存当前所有数的|值,如果(temp|当前数之后&k)==(temp|当前数)  这里要注意加小括号(运算优先级问题),则说明当前数字不会改变最终答案(不会使0的位置变成1),将当前数字添加当res当中,否则跳出循环,说明当前数组的MEX最大只能是i,如果循环提前终止,则剩下的数都填入k即可,否则对于最后一个位置的数,如果temp|n-1==k,则填入n-1(保证最终结果),否则填入k

算法:贪心

时间复杂度:O(n)

AC代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ef(a, b, i) for (int i = a; i <= b; i++)
#define nf(a, b, i) for (int i = a; i < b; i++)
#define rf(a, b, i) for (int i = a; i >= b; i--)
#define endl '\n'
typedef pair<int, int> PII;
#define Hope_AC ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

const int N = 1010;

int t;
int n;
bool st;

void work()
{
    int x;
    cin >> n >> x;
    vector<int> res(n,x);
    st = false;
    int temp = 0;
    int pos = -1;
    nf(0,n-1,i)
    {
        if(((i|temp)&x)==(i|temp))
        {
            temp |= i;
            res[i] = i;
        }
        else
        {
            st = true;
            break;
        }
    }
    if (!st)
    {
        if((temp|n-1)==x)
            res[n - 1] = n - 1;
    }
    nf(0, n, i) cout << res[i] << ' ';
    cout << endl;
}

signed main()
{
    Hope_AC;
    cin >> t;
    while (t--)
        work();
    return 0;
}

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐