B. Pashmak and Flowers
题目链接:http://codeforces.com/problemset/problem/459/B
这道题是个水题,但是如果你想要暴力去做的话是不能过的。
思路:
首先我们对数组进行排序,找到最大值和最小值。然后统计最大值和最小值出现的次数,然后相乘就可以了。
但是!
如果最大值和最小值相等呢?也就是说这个数组的所以元素都是一样的,那么是不符合上述公式的。
所以我们需要特判一下。如果都相等的时候,任意取两个都符合条件,n*(n-1)/2
因为出现了相乘,所以我们还得考虑类型的转化。 int-> long long
所以这道题的坑点还是挺多的。
1 #include <iostream> 2 #include <algorithm> 3 #include <stdlib.h> 4 #include <string> 5 #include <string.h> 6 #include <set> 7 #include <queue> 8 #include <stdbool.h> 9 #include <map> 10 11 using namespace std; 12 const int MAXN=200005; 13 14 int n; 15 int a[MAXN]; 16 int vis[MAXN]; 17 18 int main() 19 { 20 #ifndef ONLINE_JUDGE 21 freopen("../in.txt","r",stdin); 22 #endif 23 scanf("%d",&n); 24 for (int i=0;i<n;i++){ 25 cin >> a[i]; 26 } 27 sort(a,a+n); 28 long long int cnt = 0; 29 int max_count = a[n-1] - a[0]; 30 int mx = a[n-1]; 31 int mm = a[0]; 32 int m1 = 0; 33 int m2 = 0; 34 for (int i=0;i<n;i++) 35 { 36 if (a[i] == mx) 37 m1++; 38 if (a[i] == mm) 39 m2++; 40 } 41 cnt = (long long)m1*m2; 42 if (mx == mm) 43 cnt = (long long)(n-1)*n/2; 44 cout << max_count << " " << cnt << endl; 45 return 0; 46 }