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;
    }
  • 相关阅读:
    c++之类模板
    c++之函数模板
    c++之继承三
    c++之继承二
    c++之继承一
    c++之类类型转换
    c++之运算符重载二
    c++之运算符重载一
    Mahout学习路线路
    数据库分区
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7460331.html
Copyright © 2011-2022 走看看