3個數和為0 51Nod 1090

2021-08-04 21:04:34 字數 1217 閱讀 9741

給出乙個長度為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,那麼我們可以列舉其中兩個已知,得到

第三個數的大小,然後開始搜尋這個陣列裡面有沒有這第三個數?怎麼樣搜尋呢?難道用dfs,加標記嗎?

(可能會超時),

而且題目要求

這3個數按照從小到大的順序排列。所以你一定開始就用sort排序,而且枚

舉時一定是從最小的開始列舉,為了避免重複,那麼第三個數一定在這列舉的兩個數的後面的區間裡面

。那麼再寫乙個呼叫函式用二分法查詢,傳遞區間左側,區間右側為(n-1),開始查詢。

#include #include #include using namespace std;

#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個數中最小的數從小...