【题解】选牛

题目描述

        在一条坐标轴上,有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;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10587447.html
今日推荐