有趣的数字
时间限制:1秒
空间限制:32768K
题目描述:
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢?
输入描述:
输入包含多组测试数据。
对于每组测试数据:
N-本组测试数据有n个数
a1,a2...an-需要计算的数据
保证:1<=N<=100000,0<=ai<=INT_MAX.
输出描述:
对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
输入示例:
6
45 12 45 32 5 6
输出示例:
1 2
思路:
将数据进行排序,
从头开始遍历得到最小的数min的个数,
从尾开始遍历得到最大的数max的个数,
若最大的数max的个数,则从比 max 小 n 的 max2(n为max与其他数的最小差)的位置开始遍历,得到max2的个数
差最小的对数有三种情况:
第一种:存在唯一 一个最大的数max和唯一 一个比 max 小 n 的 max2(n为max与其他数的最小差),如(1,1,8,9),这种情况差最小的对数为1
第二种:存在唯一 一个最大的数max和 m 个比 max 小 n 的 max2,如(1,8,8,9),这种情况差最小的对数为m
第三种:存在n个最大的数max,如(1,9,9,9),这种情况差最小的对数为n*(n-1)/2
差最大的对数存在三种情况:
第一种:存在唯一 一个最大的数max和唯一 一个最小的数,如(1,1,8,9),这种情况差最小的对数为1
第二种:存在唯一 一个最大的数max和n个最小的数,如(1,1,8,8,9),这种情况差最小的对数为n
第三种:存在m个最大的数max和唯一 一个最小的数,如(1,9,9,9),这种情况差最小的对数为m
第三种:存在m个最大的数max和n个最小的数,如(1,1,9,9,9),这种情况差最小的对数为m*n
Python代码:
1 #coding=utf-8
2 #__author:Administrator
3 #__time:2018/5/22 17:54
4 #__file_name:[编程题] 有趣的数字
5
6
7 date =[]8 num =int(raw_input())9 str_in =raw_input()10 date = [int(n) for n instr_in.split()]11 date.sort()12 Max = date[num-1]13 Max2= date[num-2]14 Min =date[0]15 i = num-1
16 tmax =017 tmax2=018 tmin =019 while i>0 :20 if Max ==date[i]:21 tmax += 1
22 i -= 1
23 else:24 break
25 if tmax == 1:26 i = num-2
27 while i>0:28 if Max2 ==date[i]:29 tmax2 += 1
30 i -= 1
31 else:32 break
33 i =034 while i
37 i += 1
38 else:39 break
40 if tmax > 1:41 small = (tmax*(tmax-1))/2
42 elif tmax == 1 and tmax2 == 1:43 small = 1
44 elif tmax == 1 and tmax2 > 1:45 small =tmax246
47 if tmax == 1 and tmin == 1:48 big = 1
49 elif tmax >1 and tmin == 1:50 big =tmax51 elif tmax == 1 and tmin>1:52 big =tmin53 else:54 big = Max *Min55
56 print small, big