3 条题解

  • 2
    @ 2024-8-16 13:32:32

    224. NOIP2015PJ-28(题解)

    题面

    28.(完善程序)

    (中位数median)给定 n(n 为奇数且小于 1000)个整数,整数的范围在 0 至 m(0 < m <2^31)之间,请使用二分法求这 n 个整数的中位数。所谓中位数,是指将这 n 个数排序之后,排在正中间的数。(第五空 2 分,其余 3 分)

    #include <iostream>
    using namespace std;
    const int MAXN = 1000;
    int n, i, lbound, rbound, mid, m, count;
    int x[MAXN];
    
    int main()
    {
        cin >> n >> m;
        for(i = 0; i < n; i++)
            cin >> x[i];
        lbound = 0;
        rbound = m;
        while(_________________________)
        {
            mid = (lbound + rbound) / 2;
            _________________________;
            for(i = 0; i < n; i++)
                if(_________________________)
                _________________________;
            if(count > n / 2)
                lbound = mid + 1;
            else
                _________________________;
            cout << mid << " " << lbound << " " << rbound << " " << count << endl;
        }
        cout << rbound << endl;
        return 0;
    }
    

    分析

    1.二分法模板(直接套)

    秒了1,2,4,5题好吧~

    2.思维

    注意!mid是一个数,要用mid与x数组的数来比较 而不是x数组与x数组的数进行比较

    3.解析

    ①:[lbound<=rbound]

    ②:[count=0]

    ③:[mid<=x[i]]

    ④:[count++]

    ⑤:[rbound=mid-1]

    最后!!!

    不要输入多余的空格!(只写代码)

    吃过亏的都emo......了

  • 0
    @ 2024-12-5 18:31:17

    ①: lbound<=rbound

    ②: count=0

    ③: mid<=x[i]

    ④: count++

    ⑤: rbound=mid-1

    • -2
      @ 2024-8-16 13:30:05
      #include <iostream>
      using namespace std;
      const int MAXN = 1000;
      int n, i, lbound, rbound, mid, m, count;
      int x[MAXN];
      
      int main()
      {
          cin >> n >> m;
          for(i = 0; i < n; i++)
              cin >> x[i];
          lbound = 0;
          rbound = m;
          while(_________________________)
          {
              mid = (lbound + rbound) / 2;
              _________________________;
              for(i = 0; i < n; i++)
                  if(_________________________)
                  _________________________;
              if(count > n / 2)
                  lbound = mid + 1;
              else
                  _________________________;
              cout << mid << " " << lbound << " " << rbound << " " << count << endl;
          }
          cout << rbound << endl;
          return 0;
      }
      
      • 1

      信息

      ID
      224
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      (无)
      递交数
      280
      已通过
      23
      上传者