试题编号: |
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 }