傳送門:problem 2785
題意:
給定 n 行數,每行都有 4 個數a,b,c,d。
要從每列中各抽取出乙個數,問使四個數的和為0的所有方案數。
相同數字不同位置當作不同數字對待。
題解:
如果採用暴力的話,從4個數列中選擇數組合,共有(n^4)種選擇,故時間複雜度為o(n^4),指定會超時。
但,如果將它們分成 ab,cd兩組,每組只有 n^2 個組合,而 n 的資料範圍為 n < 4000,故採用此種方法不會超時。
ac**:
1 #include2 #include3 #include4view codeusing
namespace
std;
5#define ll long long
6const
int maxn=4000+50;7
8intn;9
int a[maxn*maxn];
10int b[maxn*maxn];
11int num[maxn][5
];12
13ll solve()
1423 sort(a+1,a+index);
24 sort(b+1,b+index);
25 ll res=0;26
/**27a+b+c+d=0 -> c+d=-(a+b)
28而c+d的所有值已經預處理好,故可通過二分查詢存在於b中 -(a+b) 的個數即可29*
*/30
for(int i=1;i < index;++i)
3138
return
res;39}
4041
intmain()
4250
return0;
51 }
poj2785 折半列舉 挑戰程式設計競賽
2018 1 10 這道題目如果直接列舉的話,需要我們o n 4 的複雜度,但是我們如果用二分搜尋的話,可以加快我們的求解。由題意可以得知,我們要求出滿足a b c d 0的所有情況,那麼可以轉換為a b c d,假設我們可以求出的c d的大小,那麼我們可以求出a b的大小組成的陣列,排序後找出所有...
poj2785 二分查詢
題目大意 給定n行數 n 4000 每行4個數。從這4列中,每列選擇乙個數使其和為0 暴力列舉 o n 4 會tle。優化 列舉第1,2列算出總和s1,列舉第3,4列算出總和s2。然後列舉s1,在s2中二分查詢等於 s1的數即可 o n 2log n 2 第一次wa 沒有認識到,s2陣列中有相同的數...
二分 折半 查詢
折半查詢 又叫二分查詢,採用分治思想,適用於不經常變動且查詢頻繁的表 演算法思想 將n個元素 假設n個元素公升序 分為大致相同的兩部分,取data n 2 與目標元素m比較 若data n 2 m return n 2 若data n 2 m 則我們只要在data的左半部分繼續查詢 若data n ...