题目链接
题意:
i,j,k不等,找出ai*aj*ak最小的情况下有几种取法.
可能是太久不刷题,水题都不会了,这个题思路很好想,排个序就行。然后分情况讨论,分情况讨论的时候我蒙了,a比较大记录个数不是很好记录,虽然那也可以做吧,但是感觉还是那样比较简单.
感觉自己对这些STL库的东西还是不太熟悉,有时候想不起来不会灵活应用。
这个题就分a[1]==a[3] 表示最小的三个数一样,有几种取法
a[1]==a[2] 就只能看最后一个数有几种取法了
a[2]==a[3]看他俩有几种取法
否则看a[3]有几种取法.
但是这个题最最最重要的就是,用upper_bound直接求出有几个数,因为是排序晚了有序的.
其实用map记录也可以啊,这些都无所谓,就是忘了upper_bound 复习一下吧.
#include<bits/stdc++.h> #define Ri(a) scanf("%d", &a) #define Rl(a) scanf("%lld", &a) #define Rf(a) scanf("%lf", &a) #define Rs(a) scanf("%s", a) #define Pi(a) printf("%d\n", (a)) #define Pf(a) printf("%lf\n", (a)) #define Pl(a) printf("%lld\n", (a)) #define Ps(a) printf("%s\n", (a)) #define W(a) while(a--) #define CLR(a, b) memset(a, (b), sizeof(a)) #define MOD 1000000007 #define inf 0x3f3f3f3f #define exp 0.00000001 #define pii pair<int, int> #define mp make_pair #define pb push_back using namespace std; typedef long long ll; const int maxn=1e5+10; ll a[maxn]; ll n; int main() { Rl(n); for(int i=1;i<=n;i++) { Rl(a[i]); } sort(a+1,a+1+n); if(a[1]==a[3]) { ll k=upper_bound(a+1,a+1+n,a[1])-&a[1]; ll s=k*(k-1)*(k-2)/6; Pl(s); } else if(a[1]==a[2]) { ll k=upper_bound(a+1,a+1+n,a[3])-&a[3]; Pl(k); } else if(a[2]==a[3]) { ll k=upper_bound(a+1,a+1+n,a[2])-&a[2]; ll s=k*(k-1)/2; Pl(s); } else { ll k=upper_bound(a+1,a+1+n,a[3])-&a[3]; Pl(k); } return 0; } Marcus-Bao 认证博客专家 推荐系统 ACM算法竞赛 机器学习 本科毕业于国内知名四非大学,现中国科学院大学博士生,中国科学院计算技术研究所vipl实验室,老年ACM铁牌退役选手,喜欢算法竞赛,会点数据结构和算法,熟悉c++,python等;现阶段研究方向主要为机器学习与数据挖掘,比较关注推荐系统,发过顶会,炼过丹,平时博客主要记录些关于算法、数据结构,人工智能技术以及平时看的论文总结分享等,欢迎大家关注我,一起多多交流共同进步!
