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

    Input示例
    8 9
    -1
    6
    5
    3
    4
    2
    9
    0
    8
    Output示例
    -1 9
    0 8
    2 6
    3 5

    first try:

    #include "bits/stdc++.h"
    using namespace std;
    #define LL long long
    #define INF 0x3f3f3f3f3f
    #define PI acos(-1)
    #define N 50010
    int arr[N];
    int main()
    {
        int n,k;
        while(~scanf("%d%d",&k,&n)){
            for(int i=0;i<n;i++){
                scanf("%d",&arr[i]);
            }
            sort(arr,arr+n);
            int c=0;
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    if(arr[i]+arr[j]==k){
                        printf("%d %d
    ",arr[i],arr[j]);
                        c++;
                    }
                }
            }
            if(!c){
                printf("No Solution
    ");
            }
        }
        return 0;
    }

    O(n^2)

    Time limit exceeded,优化

     second try:

    第二层从后向前找,及时跳出

    #include "bits/stdc++.h"
    using namespace std;
    #define LL long long
    #define INF 0x3f3f3f3f3f
    #define PI acos(-1)
    #define N 50010
    int arr[N];
    int main()
    {
        int n,k;
        while(~scanf("%d%d",&k,&n)){
            for(int i=0;i<n;i++){
                scanf("%d",&arr[i]);
            }
            sort(arr,arr+n);
            int c=0;
            for(int i=0;i<n;i++){
                for(int j=n-1;j>=i+1;j--){
                    if(arr[i]+arr[j]==k){
                        printf("%d %d
    ",arr[i],arr[j]);
                        c++;
                        break;
                    }
                }
            }
            if(!c){
                printf("No Solution
    ");
            }
        }
        return 0;
    }
    View Code

    Time limit exceeded,再优化

    third try:

    转换思维,查找互补数是否存在,二分查找,分治

    #include "bits/stdc++.h"
    using namespace std;
    #define LL long long
    #define INF 0x3f3f3f3f3f
    #define PI acos(-1)
    #define N 50010
    int arr[N];
    int Find(int n,int x){
        int r=n-1,l=0,m;
        while(l<=r){
            m=(r+l)/2;
            if(x==arr[m])
                return m;
            else if(x>arr[m])
                l=m+1;
            else
                r=m-1;
        }
        return -1;
    }
    int main()
    {
        int n,k;
        while(~scanf("%d%d",&k,&n)){
            for(int i=0;i<n;i++){
                scanf("%d",&arr[i]);
            }
            sort(arr,arr+n);
            int c=0,tt;
            for(int i=0;i<n;i++){
                tt=Find(n,k-arr[i]);
                if(tt!=-1){
                    if(tt<=i)
                        break;
                    printf("%d %d
    ",arr[i],k-arr[i]);
                    c++;
                }
            }
            if(!c){
                printf("No Solution
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    各种版本控制器的作用
    mybatis的一些特殊符号标识(大于,小于,等于,不等于)
    struts2的作用是什么
    js中给数组添加元素的方法有哪些
    springmvc中拦截器配置格式
    js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池
    hover()函数的用法
    error和exception的不同与相同
    cookie和session的区别有哪些
    数据库连接池的工作机制是什么
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7460331.html
Copyright © 2011-2022 走看看