题目 | Orray
Codeforces Round #827 (Div. 4)
G. Orray
https://codeforces.com/contest/1742/problem/G
2 seconds / 256 megabytes
standard input / standard output
Problem
You are given an array
Let's define the prefix OR array
You are asked to rearrange the elements of the array
An array
Input
The first line of the input contains a single integer
The first line of each test case contains a single integer
The second line of each test case contains
It is guaranteed that the sum of
Output
For each test case print
Example
input:
5
4
1 2 4 8
7
5 1 2 3 4 5 5
2
1 101
6
2 3 4 2 3 4
8
1 4 2 3 4 5 7 1
output:
8 4 2 1
5 2 1 3 4 5 5
101 1
4 3 2 2 3 4
7 1 4 2 3 4 5 1
题解
先考虑暴力做法,每一次取数遍历整个数列,找到与前缀或的上一位做
int pre = 0, tmp = 0;
for (int i = 0; i < n; i++)
{
int idx = -1;
for (int j = 0; j < n; j++)
{
if (!vis[j] && tmp < (pre | a[j]))
{
tmp = (pre | a[j]);
idx = j;
}
}
pre = tmp;
cout << a[idx] << ' ';
vis[idx] = true;
}
用这个代码测样例就会发现问题:找到并输出了几个数之后,得到了前几个数的前缀或,再和数列中剩下的数取或得到的结果都是一样的,即
为了解决这个问题,我们当然可以把第
注意整数
那我们在一次迭代中,如果发现
代码
易错点:tmp < (pre | a[j])
的括号一定不要忘了,否则会产生错误结果。
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin >> n;
vector<int> a(n);
vector<bool> vis(n);
for (int i = 0; i < n; i++)
cin >> a[i];
int pre = 0, tmp = 0;
for (int i = 0; i < n; i++)
{
int idx = -1;
for (int j = 0; j < n; j++)
{
if (!vis[j] && tmp < (pre | a[j]))
{
tmp = (pre | a[j]);
idx = j;
}
}
if (idx == -1)
break;
pre = tmp;
cout << a[idx] << ' ';
vis[idx] = true;
}
for (int i = 0; i < n; i++)
if (!vis[i])
cout << a[i] << ' ';
cout << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
solve();
return 0;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi