蓝桥杯题库编号2143:最少刷题数,我的代码通过率是90%,但是我找不出问题在哪了/(ㄒoㄒ)/~~
有没有懂得好好人可以看看,到底是忽视哪一点了,或者有什么你认为可以检验出来错误的样例也可以,我试了好多比较特殊的样例,输出都是正确的(sad



#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int n;
int a1[100001];
int a2[100001];//这是用来放排序以后的a1数组
int b[100001];//结果放在这里面
int el = 0, er = 0;//el是和排完序以后a2[mid]相等的并且在a2[mid]左边的个数
//er就是在a2[mid]右边而且和他相等的元素的个数
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a1[i]);
}
copy(a1 + 1, a1 + 1 + n, a2 + 1);
sort(a2+1,a2+1+n);
//计算er和el
int mid = (1 + n) >> 1;
for (int i = mid + 1; i <= n; i++) {
if (a2[i] == a2[mid]) er++;
}
for (int i = mid - 1; i >= 1; i--) {
if (a2[i] == a2[mid]) el++;
}
//遍历a1里面每个元素,并且找到他在a2里面的位置,然后通过对index位置的判断和el,er大小的判断
//找出来a1数组中每个元素符合题意应该等于几,然后减去原来的数就是b[i]
int l = 1, r = n;
for (int i = 1; i <= n; i++) {
l = 1, r = n;
int m=0,index=0;
while(l<=r){
m=(l+r)>>1;
if (a1[i] < a2[m])r = m - 1;
else if (a1[i] > a2[m])l = m + 1;
else {
index = m;
break;
}
}
if (n % 2 == 0) {
if (index < mid - el) {
if (el + 1 > er - 1)b[i] = a2[mid + er ]+ 1-a1[i];
else b[i] = a2[mid]-a1[i];
}
else if (index > mid + er) b[i] = 0;
else {
if (el + 1 > er) {
if (mid == 1)b[i] = a2[n] - a1[i];//加了这一行是因为当只有两个元素,而且还不一样的时候
//不能仅仅通过下面这一行让a2[mid + er] + 1就可以,而是让第一个元素等于最后一个元素
// 例如:输入:
// 2
// 1 3
// 输出应该是:2 0,不是1 0
else b[i] = a2[mid + er] + 1 - a1[i];
}
else b[i] = a2[mid]-a1[i];
}
}
else {
if (index < mid - el) {
if (el + 1 > er)b[i] = a2[mid + er ]+ 1-a1[i];
else b[i] = a2[mid]-a1[i];
}
else if (index > mid + er)b[i] = 0;
else {
if (el > er)b[i] = a2[mid + er ]+ 1-a1[i];
else b[i] = a2[mid]-a1[i];
}
}
}
for (int i = 1; i <= n; i++) {
printf("%d ", b[i]);
}
return 0;
}