題目意思:
3個數的和為0:
給出一個長度為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 3Output 示例
-3 0 3 -3 1 2 -2 -1 3 -2 0 2 -1 0 1
題目分析:
此題可以二分,首先計算任意兩個數的和存到數組b中,進行排序a(原數組)和b數組,進行判斷a[i=0]+b[j=(n*(n-1))]=0?,如果三個數兩兩不等且等於0,則存到結果數組,(保證輸出時結果不重復),最後輸出結果集。詳見代碼,寫的有點亂,望見諒!
AC代碼:
#include#include #include #define MAX 1001 using namespace std; int a[MAX],b[3]; struct node{ int si,sj; }s[MAX*(MAX-1)]; struct Snode{ int si,sj,sk; }p[MAX*(MAX+5)]; int cmp1(node a,node b){ if(a.si+a.sj<=b.si+b.sj) return 1; return 0; } int cmp2(Snode a,Snode b){ if(a.si >n){ int k=0; for(int i=0;i >a[i]; for(int j=0;j=0){ if(s[j].si+s[j].sj+a[i]==0){ if(a[i]!=s[j].si&&a[i]!=s[j].sj){ ok=0; b[0]=a[i]; b[1]=s[j].si; b[2]=s[j].sj; sort(b,b+3); p[kk].si=b[0]; p[kk].sj=b[1]; p[kk++].sk=b[2]; } j--; } else if(s[j].si+s[j].sj+a[i]<0){ i++; } else if(s[j].si+s[j].sj+a[i]>0){ j--; } } //cout<
四個數的和是否為0
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267
給出N個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出Yes,否則輸出No。 Input
第1行,1個數N,N為數組的長度(4 <= N <= 1000) 第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)Output
如果可以選出4個數,使得他們的和為0,則輸出Yes,否則輸出No。Input 示例
5 -1 1 -5 2 4Output 示例
Yes
題目分析:
本題和三個數的和為0,算法一樣,只是這裡數組b和自己求和是否為0,比較是否用兩兩相等的時候,需要比較下標,只要相加是將兩個數的下標對應存起來即可。
AC代碼:
/** *序列中可能有重復的數 *首先兩個數相加為一個序列,再用這個序列和和本序列相加是否等於0 *判斷是注意比較是否四個數是否相等,由於可能有重復的數,只能用 *位置判斷,及記錄兩個數的位置下標進行比較, *記過等於0且不相等YES,否則NO */ #include#include #include #define MAX 1001 using namespace std; int a[MAX]; struct node{ int i,j; int sum; }s[MAX*(MAX-1)]; int cmp1(node a,node b){ if(a.sum<=b.sum) return 1; return 0; } int main() { int n; while(cin>>n){ int k=0; for(int i=0;i >a[i]; for(int j=0;j0){ j--; } } if(ok) cout<