腾讯校招笔试——小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2…an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子:
6
45 12 45 32 5 6
输出例子:
解答:先sort排序一下,如果有重复的,那么最小肯定是重复的,看有多少组。 最大肯定是最大值的个数*最小值的个数1 2
#include<bits/stdc++.h> using namespace std; int a[100005]; int b[100005]; typedef long long LL; map<int ,int > m; int main() { int n; while(~scanf("%d",&n)) { m.clear(); int j=0; int f=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); m[a[i]]++; if(m[a[i]]==1) { b[j++]=a[i]; } else { f=1; } } LL x = 0; n=j; sort(b,b+n); if(f==0) { LL Min=1e12; for(int i=1; i<n; i++) { LL num = (LL) b[i]-b[i-1]; if(num<Min) { Min=num; } } x=0; for(int i=1; i<n; i++) { LL num = (LL) b[i]-b[i-1]; if(num==Min) { x++; } } } else { x = 0; for(int i=0; i<n; i++) { if(m[b[i]]>1) { x = x + (LL)m[b[i]]*(m[b[i]]-1)/2; } } } LL y; if(n==1) { y=(LL)m[b[0]]*(m[b[0]]-1); } else { y=(LL)m[b[n-1]]*m[b[0]]; } printf("%lld %d ",x,y); } return 0; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: python提取包含关键字的整行数据
- 下一篇: JSP和Servlet面试题