[编程题] 有趣的数字

转运四方海淘网 : zysfht.com

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

输入描述:
 
  

输入包含多组测试数据。 对于每组测试数据: N - 本组测试数据有n个数 a1,a2...an - 需要计算的数据 保证: 1<=N<=100000,0<=ai<=INT_MAX.



输出描述:
 
  

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。


输入例子:
6
45 12 45 32 5 6

输出例子:
1 2
 
  
//我的代码,首先考虑n=1,然后考虑全相等。算差最大的个数很简单,不解释。算最小时,要注意出现连续数相等时,指针的变化。本文算法先计算连续出现相等数的个数liandeng+2,然后利用公式: (liandeng+2-1)*(liandeng+2)/2,算出此时最小值为0的个数,将其加入最小值总个数中。此算法时间复杂度略大于n,但远小于n^2.
#include
#include
using namespace std;
int main()
{

	int n=0, i,count,x,y,min,countmin,temp,liandeng,lianxu;
	while(cin>>n)
	{
		liandeng=0;
		int *p=new int[n];
		for(i=0;i>*(p+i);
		sort(p,p+n);
		if(n==1)
		{
			cout<<0<<" "<<0<0;i--)
		{
			
			temp=*(p+i)-*(p+i-1);
			if(temp0&&*(p+i-1)==*(p+i+1))
				{
				liandeng=liandeng+1;
				i=i-1;
				}
				if(liandeng!=0)
				{
				lianxu=(liandeng+2-1)*(liandeng+2)/2-1;	//countmin在算法发现连等出现之前已经加了1了,此处要减去。。
				countmin+=lianxu;
				i=i+1;
				}
				if(liandeng==0)
					countmin++;
				liandeng=0;
			}

		}
		x=1;y=1;
		for(i=1;i0;i--)
		{
			if(*(p+i)==*(p+i-1))
				y++;
			else
				break;
		}
		cout<

你可能感兴趣的:(C与C++)