算法刷题:有趣的数字
题目来源:牛客网
[编程题]有趣的数字
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
View Code
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N - 本组测试数据有n个数
a1,a2...an - 需要计算的数据
保证:
1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入例子:
6 45 12 45 32 5 6
输出例子:
1 2
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }