出題是一件痛苦的事情!
題目看多了也有審美疲勞,於是我捨棄了大家所熟悉的 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 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入格式 輸入共兩行。第...