4個數和為0(二分)

2021-10-02 20:27:21 字數 1617 閱讀 7050

給出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"。

sample input5-1

1-524

sample output

yes暴力的話n^4 tle

我做的時候寫的深搜+剪枝 也tle 就是如果找的四個數都是負數或者都是正數跳過,如果正數負數各一半的話,超時了…

tle**:

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e3+10;

ll a[maxn]

,n,sum,vis[maxn]

,flag=0;

void

dfs(ll step)

else

return;}

for(

int i=

1;i<=n;i++)}

}int

main()

if(num==

0||num==n)

cout<<

"no"

sort

(a+1

,a+n+1)

;dfs(1

);if(flag)

cout<<

"yes"

cout<<

"no"

}

正確解法:對整個陣列排序,便於二分。列舉前兩個數,二分查詢後兩個數的和,看四個數是否為0。n * n * log2(n)

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e3+10;

ll a[maxn]

;int

main()

sort

(a+1

,a+n+1)

;for

(int i=

1;i<=n;i++

)else

if(a[l]

+a[r]

l++;else

r--;if

(flag==1)

break;}

if(flag==1)

break;}

if(flag==1)

break;}

if(flag)

cout<<

"yes"

cout<<

"no"

}

4 個數為0 二分

vj鏈結 給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 ai 10 9 ai 10 9 output 如果可以選出4個數,使得他們的和為0,則輸出 yes 否則輸出 no...

1090 3個數和為0 (二分查詢)

給出乙個長度為n的無序陣列,陣列中的元素為整數,有正有負包括0,並互不相等。從中找出所有和 0的3個數的組合。如果沒有這樣的組合,輸出no solution。如果有多個,按照3個數中最小的數從小到大排序,如果最小的數相等則按照第二小的數排序。input 第1行,1個數n,n為陣列的長度 0 n 10...

四個數和為0(二分

題目 給出n個整數,你來判斷一下是否能夠選出4個數,他們的和為0,可以則輸出 yes 否則輸出 no input 第1行,1個數n,n為陣列的長度 4 n 1000 第2 n 1行 ai 10 9 ai 10 9 output 如果可以選出4個數,使得他們的和為0,則輸出 yes 否則輸出 no s...