程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 4 Values whose Sum is 0

4 Values whose Sum is 0

編輯:C++入門知識

這個題目同上道二分的題目一樣,只是把數字分成兩堆,在排序用二分的思想,但是必須明白,不是在找到一個的條件的情況下跳出,可能只有重復的。這裡是重點。繼續我的二分之路,我的時間復雜度很高,效率不怎麼好。看了下別人的代碼,好像都是用hash,下一站就是hash了。

4 Values whose Sum is 0

Time Limit: 15000MS   Memory Limit: 228000K
Total Submissions: 11586   Accepted: 3249
Case Time Limit: 5000MS

Description


The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .

Input


The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 228 ) that belong respectively to A, B, C and D .

Output


For each input file, your program has to write the number quadruplets whose sum is zero.

Sample Input

6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45

Sample Output

5
 
代碼:
[cpp] 
<span style="font-family:FangSong_GB2312;font-size:18px;">#include<iostream> 
#include<cmath> 
#include<vector> 
#include<algorithm> 
#define maxn 4004 
using namespace std; 
int map1[maxn*maxn]; 
int map2[maxn*maxn]; 
int a[maxn],b[maxn],c[maxn],d[maxn]; 
int main() 

      int n,i,j,k,sum,p; 
      scanf("%d",&n); 
      for(i=0;i<n;i++) 
      { 
         scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);  
      }  
      for(i=0;i<n;i++) 
        for(j=0;j<n;j++) 
         map1[i*n+j]=a[i]+b[j]; 
      for(i=0;i<n;i++) 
        for(j=0;j<n;j++) 
          map2[i*n+j]=c[i]+d[j]; 
      sort(map1,map1+n*n); 
      sort(map2,map2+n*n); 
      sum=0; 
      p=n*n-1; 
      for(i=0;i<n*n;i++) 
      {  
        while(p>=0&&map1[i]+map2[p]>0) p--; 
        if(p<0) break; 
        int temp=p; 
        while(temp>=0&&map1[i]+map2[temp]==0) 
        { 
            sum++; temp--; 
        } 
      } 
      printf("%d\n",sum); 
      //system("pause"); 
       return 0; 

          
</span> 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved