『题解』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;
}
posted @ 2022-01-21 21:10  仙山有茗  阅读(39)  评论(0编辑  收藏  举报