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 output5
這個題我一開始的思路是先定義倆函式,分別求有序數列中某個數第一次和最後一次出現的位置。然後在主函式中,首先用兩個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 行中,...