算法題_完美對

題目:

在這裏插入圖片描述

在這裏插入圖片描述

思路:
在這裏插入圖片描述
如上面的式子所示,我們可以維護每個數組與其第一個位置元素的差構成的數組,若兩個數組的差數組互爲相反數則構成對子。

接下來我們用C++進行編程:

#include<bits/stdc++.>
using namespace std;
typedef long long ll;
map<vector<int>, int> mp;

int main(){
	int n, k;
	while(cin >> n >> k)
	{
		for(int i = 0; i < n; i++)
		{
			vector<int> vec(k - 1, 0);
			int fv, v;
			cin >> fv;
			for(int j = 1; j < k; j++)
			{
				cin >> v;
				vec[j - 1] = v - fv;
			}
			mp[vec]++;
		}
		ll result = 0;
		vector<int> neg(k - 1, 0);
		if(mp.find(neg) != mp.end())
		{
			ll cnt = mp[neg];
			result += cnt * (cnt - 1) / 2;
			mp.erase(neg); 
		}
		ll pcnt = 0;
		for(auto it = mp.begin(); it != mp.end(); it++)
		{
			for(size_t i = 0; i < it -> first.size(); i++)
			{
				neg[i] = -it -> first[i];
			}
			if(mp.find(neg) != mp.end())
			{
				ll cnt = mp[neg];
				pcnt += cnt * it -> second;
			}
		}
		result += pcnt / 2;
		cout << result << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章