• 【CCF201409-1】相邻数对


    试题编号:

    201409-1

    试题名称:

    相邻数对

    时间限制:

    1.0s

    内存限制:

    256.0MB

    问题描述

      给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。

    输入格式

      输入的第一行包含一个整数n,表示给定整数的个数。
      第二行包含所给定的n个整数。

    输出格式

      输出一个整数,表示值正好相差1的数对的个数。

    样例输入

    6
    10 2 6 3 7 8

    样例输出

    3

    样例说明

      值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。

    评测用例规模与约定

      1<=n<=1000,给定的整数为不超过10000的非负整数。

    解题报告

    题意

    给定n个整数,计算相邻整数的对数。

    思路

    整数的范围为0~10000,考虑用数组b存读入的数,再开一个数组cnt记录每一个整数出现的次数,那么值正好相差一的数对一定在数组中的相邻位置。依次比较数组cnt中相邻两个元素的值(即相邻两个整数在数组b中出现的次数),若都不为0,则可以把这两个值相差1的数从数组b中一一取出配对,直到其中一个数用完,此时数对的个数就是出现次数较少的数的出现次数。即,设总数对数为ans,那么对于任意i(1<i≤10000),ans=ans+min(cnt[i-1],cnt[i])

    源代码

     1 #include <cstdio>
     2 int n,x,cnt[10005],b[10005],ans;
     3 int main()
     4 {
     5     int i;
     6     scanf("%d",&n);
     7     for (i=1;i<=n;i++)  //  i表示输入的第i个数 
     8       scanf("%d",&b[i]);
     9     for (i=1;i<=n;i++)  //  i表示输入的第i个数
    10       cnt[b[i]]++;  //  整数b[i]出现次数加一 
    11     for (i=1;i<=10000;i++)  //  i表示整数i,检验每一个可能出现的整数值 
    12       if (cnt[i]<cnt[i-1]) ans+=cnt[i];
    13       else ans+=cnt[i-1];
    14     printf("%d",ans);
    15     return 0;
    16 }

    事实上,数组b的元素在统计完出现次数后就没用了,我们可以在读入的同时统计,代码稍微修改可以省掉一个数组的空间。

     1 #include <cstdio>
     2 int n,x,cnt[10005],ans;
     3 int main()
     4 {
     5     int i;
     6     scanf("%d",&n);
     7     for (i=1;i<=n;i++)
     8     {
     9         scanf("%d",&x);
    10         cnt[x]++;
    11     }
    12     for (i=1;i<=10000;i++)
    13       if (cnt[i]<cnt[i-1]) ans+=cnt[i];
    14       else ans+=cnt[i-1];
    15     printf("%d",ans);
    16     return 0;
    17 }
  • 相关阅读:
    大道至简阅读笔记03
    团队项目二阶段-个人总结07
    团队项目二阶段-个人总结06
    团队项目二阶段-个人总结05
    学习进度条06
    领扣(LeetCode)单调数列 个人题解
    领扣(LeetCode)数字转换为十六进制数 个人题解
    领扣(LeetCode)字符串相加 个人题解
    领扣(LeetCode)删除链表中的节点 个人题解
    领扣(LeetCode)有效的括号 个人题解
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/14327523.html
Copyright © 2020-2023  润新知