給出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...