EOJ-2530 数字之和

http://acm.cs.ecnu.edu.cn/problem.php?problemid=2530

题意:求一个数组中是否存在三个数的和为0。n=1000,朴素的n^3会超时,故用二分搜索,即是把正负数存入不同的两个数组,在一个数组中任取两个,求和,然后在另一个数组中利用二分查找其相反数是否存在, 复杂度将降为n^2logn 级别

 1 #include<map>
 2 #include<cmath>
 3 #include<cctype>
 4 #include<cstdio>
 5 #include<string>
 6 #include<cstdlib>
 7 #include<cstring>
 8 #include<iostream>
 9 #include<algorithm>
10 using namespace std;
11 bool b_search(int key,int *num,int start,int end){
12     while(start<=end){
13         int m=(start+end)/2;
14         if(num[m]>key)
15             end=m-1;
16         else if(num[m]<key)
17             start=m+1;
18         else return true;
19     }
20     return false;
21 }    
22 int main(){
23     int T;
24     cin>>T;
25     while(T--){
26         int n,i=0,j=0;
27         int pos[1005],neg[1005];
28         cin>>n;
29         while(n--){
30             int x;
31             scanf("%d",&x);
32             if(x>=0)pos[i++]=x;           //存入不同数组
33             else neg[j++]=x;
34         }
35         sort(pos,pos+i);
36         sort(neg,neg+j);
37         bool f=0;
38         for(int k=0;k<i;k++)
39             for(int h=k+1;h<i;h++){                //任取两个,然后二分查找
40                 int temp=pos[k]+pos[h];
41                 if(b_search(-1*temp,neg,0,j-1)){f=1;break;}
42             }
43         if(!f){
44             for(int k=0;k<j;k++)
45                 for(int h=k+1;h<j;h++){
46                     int temp=neg[k]+neg[h];
47                     if(b_search(-1*temp,pos,0,i-1)){f=1;break;}
48                 }
49         }
50         if(f)cout<<"YES"<<endl;
51         else cout<<"NO"<<endl;
52     }
53     return 0;
54 }
View Code

 我又来hash了。。。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string>
 4 #include <algorithm>
 5 #include <string.h>
 6 #include <stdlib.h>
 7 
 8 using namespace std;
 9 short hash[300005];
10 
11 int main()
12 {
13     //freopen("testin.txt", "r", stdin);
14     //freopen("testout.txt", "w", stdout);
15     
16     int t;
17     cin >> t;
18     while(t--)
19     {
20         int n, na, nb, ia=0, ib=0;
21         int a[1005], b[1005];
22         cin >> n;
23         while(n--)
24         {
25             int x;
26             scanf("%d", &x);
27             if(x >= 0)
28                 a[ia++] = x;
29             else
30                 b[ib++] = x;
31         }
32         na = ia, nb = ib;
33         memset(hash, 0, sizeof(hash));
34         for(int i=0; i<na-1; i++)
35             for(int j=i+1; j<na; j++)
36                 hash[a[i]+a[j]] ++;
37         int isyes = 0;
38         for(int i=0; i<nb; i++)
39             if(hash[-1*b[i]])
40             {
41                 isyes = 1; 
42                 break;
43             }
44         if(isyes)
45             cout << "YES" << endl;
46         else
47             cout << "NO" << endl; 
48     }
49     
50     
51     return 0;
52 }
View Code

 

posted on 2013-06-12 03:38  KimKyeYu  阅读(318)  评论(0编辑  收藏  举报

导航