_Drizzle 2025-02-13 18:57 采纳率: 100%
浏览 39
已结题

蓝桥杯题库编号2143:最少刷题数,我的代码通过率是90%,但是我找不出问题在哪了(相关搜索:蓝桥杯)

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

img

img

img

#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;
}

  • 写回答

5条回答 默认 最新

  • 智者知已应修善业 2025-02-14 09:32
    关注

    排序后效率有提高?看代码循环没减少,判断也没减少.
    不排序的话就是nn的算法,从头到尾一遍处理,条件需要判断,按题目样例,多和少的个数有差则处理使得个数相等,多和少的个数相等则不处理。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 已采纳回答 2月18日
  • 修改了问题 2月13日
  • 修改了问题 2月13日
  • 展开全部