题意
- 有一个错误的二分查找代码,题目输入三个数: n , x , y n,x,y n,x,y ,分别是:数组长度,查找元素,判断值。
- 如果 y = 1 y=1 y=1,则输出能够使此二分查找正确的数组
- 如果 y = 2 y=2 y=2,则输出使其出错的数组
- 要求输出满足条件、且字典序最小的数组
题解
- 题目不难,稍加分析即可发现,此二分查找算法中,区间形式为:左闭右开。对于相等元素,直接越过了。
- 所以只要数组中有和带查找元素 x x x 相等的值,就会出错;反之,没有和 x x x 相等的元素,查找不会出错。
- 注意输出字典序最小的。
- x < = n & & y = 1 : − − 1.2.3.... ( x − 1 ) . ( x + 1 ) . . . . ( n + 1 ) x<=n \ \&\&\ y=1:-- \ 1.2.3....(x-1).(x+1)....(n+1) x<=n && y=1:−− 1.2.3....(x−1).(x+1)....(n+1)
- x > n & & y = 1 : − − 1.2.3.... n x>n \ \&\& \ y=1\ \ \ :\ --1.2.3....n x>n && y=1 : −−1.2.3....n
- x < = n & & y = 2 : − − 1.2.3.... n x<=n\ \&\&\ y=2:\ --1.2.3....n x<=n && y=2: −−1.2.3....n
- x > n & & y = 2 : − − 1.2.3.... ( n − 1 ) . x x>n\ \&\&\ y=2\ \ \ :\ --1.2.3....(n-1).x x>n && y=2 : −−1.2.3....(n−1).x
AC-Code
#include <bits/stdc++.h>
using namespace std;
int main() {
int T; cin >> T;
while (T--) {
int n, x, y; cin >> n >> x >> y;
if (x <= n && y == 1) {
for (int i = 1; i <= x - 1; ++i) cout << i << " ";
for (int i = x + 1; i <= n; ++i) cout << i << " ";
cout << n + 1;
}
else if (x > n && y == 1) {
for (int i = 1; i <= n - 1; ++i) cout << i << " ";
cout << n;
}
else if (x <= n && y == 2) {
for (int i = 1; i <= n - 1; ++i) cout << i << " ";
cout << n;
}
else if (x > n && y == 2) {
for (int i = 1; i <= n - 1; ++i) cout << i << " ";
cout << x;
}
cout << endl;
}
return 0;
}