【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 }

 

posted @ 2021-01-25 21:26  SAKURA12  阅读(599)  评论(0)    收藏  举报