PAT:1048. Find Coins (25)(二分查找) AC

#include<stdio.h>
#include<algorithm>
using namespace std;

int arr[100066];

int FIND(int l,int r,int aim)    //二分查找,从l到r,查找aim
{
  int mid;
  while(l<=r)
  {
    mid=(l+r)/2;
    if(arr[mid]==aim)
      return mid;        //找到:返回坐标
    else if(arr[mid]<aim)
      l=mid+1;
    else
      r=mid-1;
  }
  return -1;            //没有找到
}

int main()
{
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i=0 ; i<n ; ++i)
    scanf("%d",&arr[i]);
  sort(arr,arr+n);          //排序之后才能用二分查找
  for(int i=0 ; i<n ; ++i)
  {
    int x=FIND(i+1,n-1,m-arr[i]);  //找下标为i数字的对立数,l从i+1开始可以保证找到的数下标不是原数。而且数组升序,前面的没找到,后面的也用不到前面的了
    if(x!=-1)        //-1代表对立数字存在   //另一种写法:FIND(0,n-1,m-arr[i])   if(x!=-1 && x!=i)   还要求了存在的数字不是原来的arr[i]
    {
      printf("%d %d",arr[i],m-arr[i]);
      return 0;
    }
  }
  printf("No Solution");
  return 0;
}
posted on 2015-03-04 01:28  Evence  阅读(94)  评论(0编辑  收藏  举报