zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [SDOI2011]消防
    10.15 上午 考试
    松鼠搬家 ( 切比雪夫距离 到 曼哈顿距离 )
    10.14 上午 考试
    10.13 下午
    bzoj2640 元素 线性基+贪心
    猪国杀 大模拟
    10.13 上午 考试
    10.12 两次考试
    阿狸和桃子的游戏
  • 原文地址:https://www.cnblogs.com/Evence/p/4312252.html
Copyright © 2011-2022 走看看