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 }

 

posted @ 2019-07-19 20:58  _Ackerman  阅读(231)  评论(0编辑  收藏  举报