题目描述
在一条坐标轴上,有n头奶牛,第i头奶牛的位置是Xi。FJ现在要选出三头奶牛去比赛,不妨假设选择了奶牛a,b,c。那么必须要满足:
1:Xa<Xb<Xc。
2:Xb-Xa≤Xc - Xb≤2×(Xb-Xa)。
你的任务是计算,FJ总共有多少种不同的选择?
输入输出格式
输入格式
第一行,一个整数N。(3≤N≤1000)。
接下来有N行,第i行是整数Xi。
输出格式
一行,一个整数。
输入输出样例
输入样例
5
3
1
10
7
4
输出样例
4
题解
枚举两头牛然后二分第三头牛即可。
#include<iostream> #include<algorithm> using namespace std; int n; int a[1005]; int be,en; int ans; int BSL(int oa,int ob,int l,int r,int m) { if(l>r) return l; if(ob-oa>a[m]-ob) return BSL(oa,ob,m+1,r,(m+1+r)/2); else return BSL(oa,ob,l,m-1,(l+m-1)/2); } int BSR(int oa,int ob,int l,int r,int m) { if(l>r) return r; if(a[m]-ob>2*(ob-oa)) return BSR(oa,ob,l,m-1,(l+m-1)/2); else return BSR(oa,ob,m+1,r,(m+1+r)/2); } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n); for(int i=1;i<=n-2;i++) { for(int j=i+1;j<=n-1;j++) { be=BSL(a[i],a[j],j+1,n,(j+1+n)/2); en=BSR(a[i],a[j],j+1,n,(j+1+n)/2); ans+=en-be+1; } } cout<<ans; return 0; }