算法刷题:有趣的数字

题目来源:牛客网
[编程题]有趣的数字
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?

 输入描述:

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

输出描述:

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

输入例子:
6
45 12 45 32 5 6
输出例子:
1 2

代码如下:
 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 int main(int argc, char** argv) {
 5     int num,t;//num是输入的数字个数,t是每次输入的数字     
 6     while(cin>>num){
 7         bool flag=false;//用来标记是否存在两个相同的数字 
 8         map<int ,int> myMap;//myMap用于存储输入的所有数字 
 9         map<int,int>::iterator ite;
10         //输入n个数字,并将其存入myMap中 
11         for(int i=0;i<num;i++){
12             cin>>t;
13             ite=myMap.find(t);
14             if(ite!=myMap.end()){                
15                 ite->second+=1;
16                 flag=true;
17             } 
18             else
19                 myMap[t]=1;
20         }
21         //打印输入的n个数字,及其出现的次数 
22 //        for(ite=myMap.begin();ite!=myMap.end();ite++)
23 //            cout<<ite->first<<" "<<ite->second<<endl;
24         //计算差值最小的对数 
25         int min=0,minv=-1,k;//min用来存储差值最小的对数,minv存储最小的差值、k存储每次遍历的差值 
26         if(flag){//存在数字重复出现的情况 
27             for(ite=myMap.begin();ite!=myMap.end();ite++)
28                 if(ite->second>1)
29                     min+=(ite->second)*(ite->second-1)/2;
30         } 
31         else{//不存在数字重复出现的情况 
32             map<int,int>::iterator ite2=(++myMap.begin());
33             for(ite=myMap.begin();ite2!=myMap.end();ite++,ite2++){
34                 k=ite2->first-ite->first;
35                 if(minv==-1||k<minv){
36                     min=1;
37                     minv=k;
38                 }
39                 else if(k==minv){
40                     min+=1;
41                 }
42             }
43         }
44         //计算差值最大的对数
45         int max;
46         if(myMap.rbegin()->first==myMap.begin()->first)//只有一种数字
47             max=(myMap.begin()->second)*(myMap.begin()->second-1)/2;
48         else
49             max=(myMap.begin()->second)*(myMap.rbegin()->second);
50         //打印差值最小对数、差值最大对数
51         cout<<min<<" "<<max<<endl;
52     }
53     
54     return 0;
55 }
View Code

 

 

posted @ 2016-08-31 18:26  Disen  阅读(815)  评论(0编辑  收藏  举报