week4 B 四個數列

2021-10-03 22:23:18 字數 1645 閱讀 7764

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。

當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。

input

第一行:n(代表數列中數字的個數) (1≤n≤4000)

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)

output

輸出不同組合的個數。

sample input

6-45

2242-16

-41-27

5630-36

53-3777-36

30-75-

4626-38

-1062-

32-54-

645

sample output
5
這個題我一開始的思路是先定義倆函式,分別求有序數列中某個數第一次和最後一次出現的位置。然後在主函式中,首先用兩個for迴圈求出陣列a[i]+b[j]的值存到陣列tmp1中,存完用sort排序,然後再利用倆for迴圈求出數列c、d的和sum,呼叫倆函式分別求出-sum在排序後陣列tmp1中的first和last位置,ans+=first-last+1。

當時寫錯了幾個地方一直沒找出來,後面完整**是重寫後的,不過我發現了幾處錯誤又修改對了,在此mark一下:

錯誤**:

int

find_first

(int x)

else l=mid+1;

}return ans;

}

下面是修改後的正確**:

int

find_first

(int x)

else

if(tmp1[mid]

>x)

r=mid-1;

else l=mid+1;

}if(ans==-1

) ans=0;

//沒找到

else

return ans;

}

當時我又重新寫了乙個,這次不再單獨寫那兩個函式,而是直接在主函式裡判斷。還是在陣列tmp1中尋找與tmp2中相加和為零的第乙個位置,判斷是否後面還有相同的數字,若有,則加到一起。

#include

#include

using

namespace std;

int n;

int a[

4005

],b[

4005

],c[

4005

],d[

4005];

int tmp1[

16000005];

int tmp2[

16000005];

intmain()

int k=0;

for(

int i=

0;isort

(tmp1,tmp1+n*n)

;int l,r,ans=0;

for(

int i=

0;i} cout

}

week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!輸入輸出格式input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的...

Week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四個數字,分別...

week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,...