『题解』CodeForces CF1613B Absent Remainder
题目大意
在一个长度为 \(n\) 的序列中,找出 \(\lfloor \cfrac{n}{2} \rfloor\) 个不同的二元组 \((x,y)\),满足一下性质:
- \(x \neq y\)。
- \(x\) 和 \(y\) 均在序列中。
- \(x \bmod y\) 不在序列中。
思路
前两条性质很容易实现,关键是第三条。
\(x \bmod y\) 不在序列中。
我们可以发现,无论如何,\(x \bmod y\) 的结果总是比 \(y\) 小。
这样我们就可以很容易地解决这一条性质,先将序列排序,这样第一位就是最小值,把它当作 \(y\)。接着,再从序列中随便调出 \(\lfloor \cfrac{n}{2} \rfloor\) 个数来充当 \(x\) 就 ok 了qwq。
排序之后,从第二项遍历到第 \(\lfloor \cfrac{n}{2} \rfloor +1\) 项,每次输出二元组。
\(\lfloor \cfrac{n}{2} \rfloor +1\) 可以使用位运算优化,记得位运算符优先级很低,要加上括号再加一:(n>>1)+1
。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int t,n,a[200005];
int main(){
cin >> t;
while(t--){
cin >> n;
for(int i=1; i<=n; i++){
cin >> a[i];
}
sort(a+1,a+n+1);
for(int i=2,l=(n>>1)+1; i<=l; i++){
cout << a[i] << " " << a[1] << endl;
}
}
return 0;
}