zoukankan      html  css  js  c++  java
  • 1001 数组中和等于K的数对——51NOD

    这是我在51nod上做的第一道一级算法题,感觉51nod的低级题也没那么难嘛,这就是一道划水题,简单的二分查找就可解了。
    我有两种解法,第一种想来效率没二分高,就是排序后分别从头和从后遍历,然后头指针只能向后,尾指针只能向前,这样就避免了一些重复,但是具体会不会TLE就没去尝试了。
    第二种解法就是二分查找,我是在二分里揉进了第一种的思想,也避免了一部分重复,当然其实对于二分而言这点小重复也不会有太大的影响了,毕竟是O(log n)的复杂度。然后如果前后指针相遇的时候就不用重复了,所以我的复杂度应该是O(nlogn)

    题目如下:
    这里写图片描述

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define MAX_LEN 50001
    
    int sum=0;
    
    int searchAndOutput(LL *a,int start,int tail,LL k)
    {
        LL need = k-a[start];
    
        start++;
        int s=start,t=tail,m;
        m=(tail-start)/2;
        while(s <= t)
        {
            if(a[m] == need)
            {
                if(a[start-1] == a[m])
                {
                    return tail;
                }
                cout<<a[start-1]<<" "<<a[m]<<endl;
                sum++;
                return m;
            }
            if(a[m] > need)
            {
                t = m-1;
                m=(s+t)/2;
            }
            else if(a[m] < need)
            {
                s = m+1;
                m=(s+t)/2;
            }
        }
        return tail;
    
    }
    
    
    int main()
    {
        LL k;
        int n;
        cin>>k>>n;
        int t=n;
        LL a[MAX_LEN];
        while(n--)
        {
            cin>>a[n];
        }
        n=t-1;
        sort(a,a+t);
    
        int i=0;
        while(i<n)
        {
            n=searchAndOutput(a,i,n,k);
            i++;
        }
        if(sum == 0)
        {
            cout<<"No Solution"<<endl;
        }
    
    }
    
    
    
  • 相关阅读:
    C#按模板生成word文档总结
    Aspose.Words.dll根据模板生成word
    WCF服务
    Fiddler抓包工具
    文本过长显示...
    java JDK 环境变量配置
    js return关键字
    js限制文本框输入内容
    jQuery学习一
    JSON 教程
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287542.html
Copyright © 2011-2022 走看看