洛谷 P1102 A B數對 題解

2022-05-01 04:18:10 字數 1800 閱讀 6688

出題是一件痛苦的事情!

題目看多了也有審美疲勞,於是我捨棄了大家所熟悉的 a+b problem,改用 a-b 了哈哈!

好吧,題目是這樣的:給出一串數以及乙個數字 c,要求計算出所有 a-b=c 的數對的個數。(不同位置的數字一樣的數對算不同的數對)

第一行包括2個非負整數n和c,中間用空格隔開。

第二行有n個整數,中間用空格隔開,作為要求處理的那串數。

輸出一行,表示該串數中包含的所有滿足a-b=c的數對的個數。

輸入 #1

4 11 1 2 3

輸出 #1

對於73%73%的資料,n≤2000;

對於100%100%的資料,n≤200000。

所有輸入資料都在longint範圍內。

2017/4/29新添資料兩組

兩種思路,用桶或者用雙指標

輸入資料,用乙個桶存一下

然後從1列舉到最大值

如果乙個數出現過

並且他減去c的數也出現過

那麼數對的數量就是

這兩個數的桶裡面存的值乘起來

最後加起來就好了

#include#include#includeusing namespace std;

int a[200005];//桶儲存每個出現過的數的次數

maptong;

int main()

long long js = 0;

for(int i = 1;i <= n;++ i)

printf("%lld\n",js);

return 0;

}

雙指標

現將輸入的那串數字排一下序

然從以乙個開始列舉

頭指標先不動

尾指標累加知道尾指標所在的位置上面的數

減去頭指標所在的數的差大於等於c

然後判斷是否等於c

如果等於c計數器累加

不過這道題目會出現重複的數

如果單純的按照上面的方法是沒法處理重複的數

所以可以在

當你找到一組差恆等於c的數的時候

判斷一下大的後面還有沒有也可以減去小的恆等於c的

也就是等於大的的

為什麼不處理小的而是處理大的呢?

因為我的思路是列舉小的所以小的都會掃一遍

但是大的確實會跳過去的

所以應該處理大的

不過如果你處理出來有多少個和他相等的

那就用乙個桶記錄一下

到時候再一次用到的話直接o(1)查詢就好

不然會超時

依次列舉下去

因為頭指標和尾指標都是只將那串數字掃一遍

所以複雜度是線性的

#include#include#includeusing namespace std;

const int max = 200005;

int a[max];

int t[max];

int main()

else

js += jj;

} }cout << js << endl;

return 0;

}

其實還有更簡單的方法的

思路說一哈:

列舉大數a,用雙指標法找到最靠前與a差≤ c的,和最靠後與a差≥ c的。如果這兩個位置不是在同乙個數上面,那麼他們中間就是還有符合要求的數,所以這中間的數的個數(包括兩個位置上面的)都累加起來。

但是貌似實現起來很複雜,只想出來了思路沒有去實現瞎搞了一下搞了上面的思路然後a掉了qwq

洛谷 P1102 A B 數對 題解

鏈結 出題是一件痛苦的事情!相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a b problem,改用 a b 了哈哈!好吧,題目是這樣的 給出一串數以及乙個數字 c cc,要求計算出所有 a b c a b c a b c的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入共兩行。...

洛谷P1102 A B 數對

題目描述 出題是一件痛苦的事情!相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a b problem,改用 a b 了哈哈!好吧,題目是這樣的 給出一串數以及乙個數字 c,要求計算出所有 a b c 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入格式 輸入共兩行。第一行,兩個整...

P1102 A B 數對洛谷c 題解

題目描述 出題是一件痛苦的事情!相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a b problem,改用 a b 了哈哈!好吧,題目是這樣的 給出一串數以及乙個數字 cc,要求計算出所有 a b ca b c 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入格式 輸入共兩行。第...