目录
题目:
题目理解:
给你两个整数 n , x 再给你一个长度为 n 数组 a ,问最少增加多少个数字才能让数组中的数字可以两两配对且其中一个是另一个的x倍
思路:
贪心为主要思路,先假定都需要配对(设配对数量cnt = n),然后我们只要从小往大遍历会出现两种情况:
①如果 出现在了后面,我们就把
和
都踢出去,同时 cnt -= 2 (即这两个不需要配对的意思)
②如果没有出现在后边,我们就把
踢出去,然后cnt不动(因为
需要被配对)
所以用STL的map来存储数据非常适配这道题
思路已经有了,具体操作请看下面AC代码
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
ll a[N];
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t; cin >> t;
while (t--)
{
map < ll, ll > mp;
int n, x;
cin >> n >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++)
mp[a[i]]++;
ll cnt = n;
for (int i = 1; i <= n; i++)
{
if (!mp[a[i]])continue;
ll ji = a[i] * x;
if (ji > a[n])continue;
ll minn = min(mp[a[i]], mp[ji]);
cnt -= 2 * minn;
mp[a[i]] -= minn;
mp[ji] -= minn;
}
cout << cnt << '\n';
}
return 0;
}