給出乙個長度為n的無序陣列,陣列中的元素為整數,有正有負包括0,並互不相等。從中找出所有和 = 0的3個數的組合。如果沒有這樣的組合,輸出no solution。如果有多個,按照3個數中最小的數從小到大排序,如果最小的數相等則按照第二小的數排序。
input
第1行,1個數n,n為陣列的長度(0 <= n <= 1000)
第2 - n + 1行:a
i i
(-10^9 <= a
i i
<= 10^9)
output
如果沒有符合條件的組合,輸出no solution。
如果有多個,按照3個數中最小的數從小到大排序,如果最小的數相等則繼續按照第二小的數排序。每行3個數,中間用空格分隔,並且這3個數按照從小到大的順序排列。
sample input
7-3-2-10
123
sample output
-3 0 3-3 1 2
-2 -1 3
-2 0 2
-1 0 1
思路:這個和我以前做過的題很相識,那是兩數想加,這個是三個數相加,這個稍微複雜了一些,不過中心思想都一樣。有點像隱私圖搜尋。這個題,知道三個數的和為6,那麼我們可以列舉其中兩個已知,得到#include #include #include using namespace std;第三個數的大小,然後開始搜尋這個陣列裡面有沒有這第三個數?怎麼樣搜尋呢?難道用dfs,加標記嗎?
(可能會超時),
而且題目要求
這3個數按照從小到大的順序排列。所以你一定開始就用sort排序,而且枚
舉時一定是從最小的開始列舉,為了避免重複,那麼第三個數一定在這列舉的兩個數的後面的區間裡面
。那麼再寫乙個呼叫函式用二分法查詢,傳遞區間左側,區間右側為(n-1),開始查詢。
#define maxn 1000+10
int num[maxn];
int n;
int f(int k,int m)
return -1;
}int main()
{ while(~scanf("%d",&n))
{int flag=0;
memset(num,0,sizeof(num));
for(int i=0; i
4個數和為0 51Nod 1267
給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 aii 10 9 aii 10 9 output 如果可以選出4個數,使得他們的和為0,則輸出 yes 否則輸出 no sa...
51nod 1267 4個數和為0
思路 先n 2預處理出所有兩兩的組合,那麼就變成要找a b 0的問題了,那麼排序o n 去找就可以了 includeusing namespace std define ll long long const int maxn 1005 1005 struct node node maxn bool ...
51nod 1090 3個數和為0
1090 3個數和為0 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 給出乙個長度為n的無序陣列,陣列中的元素為整數,有正有負包括0,並互不相等。從中找出所有和 0的3個數的組合。如果沒有這樣的組合,輸出no solution。如果有多個,按照3個數中最小的數從小...