UVA10487二分查找上界和下界

来源:互联网 发布:linux用户权限管理 编辑:程序博客网 时间:2024/05/21 06:41

注意二分查找,查找上界的时候,返回的是等于查找的数的第一个位置,如果没有,返回前面比他大那个数的位置,

如果全部数都比他大,则返回全部数的下一个坐标,注意这里。

查找下界的时候,返回的是小于等于b的最后一个元素的后面一个位置,如果全部都小于,返回第一个数前面那个数的坐标。

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<string>#include<set>#include<map>#include<iostream>#include<algorithm>#include<vector>#include<cctype>#include<queue>#define LL long longusing namespace std;const int maxn=1e7+10;const double eps=1e-8;const int Max=2147483647;int a[1010];int sum[maxn];int main(){    int t=0;    int n;    while(cin>>n&&n)    {        t++;        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        int l=0;        for(int i=0;i<n;i++)            for(int j=i+1;j<n;j++)                sum[l++]=a[i]+a[j];        sort(sum,sum+l);     //   for(int i=0;i<l;i++)     //       cout<<sum[i]<<' ';    //    cout<<endl;        int m;        cin>>m;        cout<<"Case "<<t<<':'<<endl;        while(m--)        {            int tem;            scanf("%d",&tem);            int x=0,y=l;            while(x<y)            {                int m=x+(y-x)/2;                if(sum[m]>=tem)                    y=m;                else                    x=m+1;            }            int ans;          //  cout<<x<<endl;            if(x==0||(x!=l&&sum[x]-tem<=tem-sum[x-1]))                ans=sum[x];            else                ans=sum[x-1];            printf("Closest sum to %d is %d.\n",tem,ans);        }    }    return 0;}


0 0
原创粉丝点击