码迷,mamicode.com
首页 > 其他好文 > 详细

PAT-1048 Find Coins (25)

时间:2014-11-15 21:29:40      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   sp   for   div   on   

这道题目需要用二分查找,否则可能超时,时间复杂度应嘎是n.lgn。可以通过。

二分查找末班

int find(l,r)

{

   int mid=(l+r)/2;

   if(data[mid]==num)

         return mid;

   else if ...

        return find(l,mid-1) //注意是return find(l,mid-1)而不是find(l,mid-1)否则返回值会丢掉。

   else

       return find(mid+1,r)

}

// 1048.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;

#define MIN(a,b) a>b?b:a
#define MAX(a,b) a>b?a:b

#define max 100010
int data[max];

bool find(int l,int r,int d,int index) //二分查找需要return find(l,mid+1,...) 而不是直接调用
{
    if(l>r)
        return false;
    int mid=(l+r)/2;
    if(data[mid]==d)
    {
        if(mid!=index)
           return true;
        else //如果有多个Mid值得话,排序之后肯定是在一块的
        {
            if(data[mid+1]==d||data[mid-1]==d)
                return true;
            else
                return false;
        }
    }
    else if(data[mid]>d)
    {
        return find(l,mid-1,d,index);
    }
    else if(data[mid]<d)
    {
        return find(mid+1,r,d,index);
    }
    return false;
}
int main()
{
   int n,m;
   freopen("1048.txt","r",stdin);
   while(scanf("%d%d",&n,&m)!=EOF)
   {
       for(int i=0;i<n;i++)
       {
           scanf("%d",&data[i]);
       }
       sort(data,data+n);
       bool flag=false;
       for(int i=0;i<n;i++)
       {
           int tmp=m-data[i];
           flag=find(0,n-1,tmp,i);
           if(flag)
           {
              printf("%d %d\n",MIN(data[i],tmp),MAX(data[i],tmp));
              break;
           }
       }
       if(!flag)
       {
           printf("No Solution\n");
       }
   }
    return 0;
}

 

PAT-1048 Find Coins (25)

标签:style   blog   io   color   os   sp   for   div   on   

原文地址:http://www.cnblogs.com/championlai/p/4100194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!