zoukankan      html  css  js  c++  java
  • CCF201612-1 中间数(解法三)(100分)

    试题编号: 201612-1
    试题名称: 中间数
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
      给定一个整数序列,请找出这个整数序列的中间数的值。
    输入格式
      输入的第一行包含了一个整数n,表示整数序列中数的个数。
      第二行包含n个正整数,依次表示a1, a2, …, an
    输出格式
      如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
    样例输入
    6
    2 6 5 6 3 5
    样例输出
    5
    样例说明
      比5小的数有2个,比5大的数也有2个。
    样例输入
    4
    3 4 6 7
    样例输出
    -1
    样例说明
      在序列中的4个数都不满足中间数的定义。
    样例输入
    5
    3 4 6 6 7
    样例输出
    -1
    样例说明
      在序列中的5个数都不满足中间数的定义。
    评测用例规模与约定
      对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。

    问题链接:CCF201612试题

    问题描述:首先输入正整数n,接着输入n个正整数,如果存在一个数,比该数大或比该数小的数则输出该数,如果不存在则输出-1。

    问题分析:这个问题可以用排序来解决,这是基础。可以证明,如果存在答案则必定所有数排序后的中间位置。

    排序方法上有以下几种:

    1.对n个数进行排序,找出中间那个数,然后将中间那个数的左右与其相等的数去掉,看左右剩下的数个数是否相等,如果相等则中间那个数就是答案,否在输出-1。

    2.使用分治法,按照快速排序的基本思想来处理,只需要将中间的那个数找到即可。

    3.使用STL的map类对数据进行排序。这种方法在同值的数据比较多时候,存储上会节省一些。

    4.按照桶排序的基本思想,将相同的值放入同一个桶中,即对同值数据进行计数,然后再计算中间值。

    程序说明

    这里写了C语言和C++语言两个版本的程序。

    本程序采用上述的第4种方法实现,使用一个数组valcount[]来统计各种值的数量。这样做事需要一个前提的,即数据值得范围不可以太大。本问题中“对于所有评测用例,1ai1000”,所以才是可行的。

    使用条件表达式输出结果是一种推荐的写法,代码比较简洁易懂。


    参见:

    CCF201612-1 中间数(100分)

    CCF201612-1 中间数(解法二)(100分)


    提交后得100分的C语言程序如下:

    /* CCF201612-1 中间数(解法三) */
    
    #include <stdio.h>
    #include <string.h>
    
    #define N 1000
    int valcount[N+1];        // 对于所有评测用例,1 ≤ ai ≤ 1000
    
    int main(void)
    {
        int n, val;
    
        // 变量初始化:清零
        memset(valcount, 0, sizeof(valcount));
    
        // 输入数据,统计各个值得数量
        scanf("%d", &n);
        for(int i=0; i<n; i++) {
            scanf("%d", &val);
            valcount[val]++;
        }
    
        // 找出中间数
        int ans, mid=(n+1)/2, count=0, left;
        for(int i=1; i<=N; i++)
            if(count + valcount[i] >= mid) {
                left = count;
                count = 0;
                ans = i;
            } else
                count += valcount[i];
    
        // 输出结果
        printf("%d
    ", (left == count) ? ans : -1);
    
        return 0;
    }


    提交后得100分的C++语言程序如下:

    /* CCF201612-1 中间数 */
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    const int N = 1000;
    int valcount[N+1];        // 对于所有评测用例,1 ≤ ai ≤ 1000
    
    int main()
    {
        int n, val;
    
        // 变量初始化:清零
        memset(valcount, 0, sizeof(valcount));
    
        // 输入数据,统计各个值得数量
        cin >> n;
        for(int i=0; i<n; i++) {
            cin >> val;
            valcount[val]++;
        }
    
        // 找出中间数
        int ans, mid=(n+1)/2, count=0, left;
        for(int i=1; i<=N; i++)
            if(count + valcount[i] >= mid) {
                left = count;
                count = 0;
                ans = i;
            } else
                count += valcount[i];
    
        // 输出结果
        if(left == count)
            cout << ans << endl;
        else
            cout << -1 << endl;
    
        return 0;
    }


  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564074.html
Copyright © 2011-2022 走看看