zoukankan      html  css  js  c++  java
  • 1090 3个数和为0(二分)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
     收藏
     关注
    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。
     
    Input
    第1行,1个数N,N为数组的长度(0 <= N <= 1000)
    第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
    Output
    如果没有符合条件的组合,输出No Solution。
    如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。
    Input示例
    7
    -3
    -2
    -1
    0
    1
    2
    3
    Output示例
    -3 0 3
    -3 1 2
    -2 -1 3
    -2 0 2
    -1 0 1

    n<1000一开始用暴力的方法,就被一组数据卡到了,后来发现是no solution的情况没有考虑到,加上这种情况后很轻松的就过了。暴力的方法O(n^3)时间复杂度很高,后来看了别人的博客,发现这道题的正解应该用二分来解

    (更快点击链接)二分解法

    #include <bits/stdc++.h>
    #define N 1005
    using namespace std;
    int k[N],n;
    bool Find(int a){
      int begin=0,end=n-1;
      while(begin<=end){
        int mid=(begin+end)>>1;
        if(k[mid]>a){
          end=mid-1;
        }else if(k[mid]<a){
          begin=mid+1;
        }else{
          return true;
        }
      }
      return false;
    }
    int main(){
      scanf("%d",&n);
      for(int i=0;i<n;i++){
        scanf("%d",&k[i]);
      }
      sort(k,k+n);
      bool prime=true;
      for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++){
          int ans=-(k[i]+k[j]);
          if(ans<=k[j])
              break;
          if(Find(ans)){
            prime=false;
            printf("%d %d %d
    ",k[i],k[j],ans);
          }
        }
      if(prime)
        printf("No Solution
    ");
      return 0;
    }
    

      

    暴力解法

    #include<bits/stdc++.h>
    #define maxn 1000+10
    using namespace std;
    
    int a[maxn];
    int i,j,k;
    int flag;
    int main()
    {
    	int n;
    	while(~scanf("%d",&n))
    	{
    		for(i=1; i<=n; i++)
    			scanf("%d",&a[i]);
    		sort(a+1, a+n+1);
    		flag = 0;
    		for(i=1; i<=n; i++)
    		{
    			for(j=n; j>0; j--)
    			{
    					for(k=i+1; k<j; k++)
    					{
    						if(a[k]+a[i]+a[j]==0)
    						{
    							printf("%d %d %d
    ",a[i],a[k],a[j]);
    							flag = 1;
    							break;							
    						}														
    					}
    			}
    		}
    		if(flag==0)
    			printf("No Solution
    ");
    	}
    	return 0;
    } 
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    MKMapVIew学习系列2 在地图上绘制出你运行的轨迹
    WPF SDK研究 Intro(6) WordGame1
    WPF SDK研究 Intro(3) QuickStart3
    WPF SDK研究 Layout(1) Grid
    WPF SDK研究 目录 前言
    WPF SDK研究 Intro(7) WordGame2
    WPF SDK研究 Layout(2) GridComplex
    对vs2005创建的WPF模板分析
    WPF SDK研究 Intro(4) QuickStart4
    《Programming WPF》翻译 第6章 资源
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7479089.html
Copyright © 2011-2022 走看看