Codeforce :C. Creating Keys for StORages Has Become My Main Skill题解
·
题目概述:在每个样例中,给出一个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;
}
更多推荐



所有评论(0)