【题解】AT_abc295_c 题解

AT_abc295_c 题解

思路分析

一道简单思维题。

首先,我们要求每次将满足 ai=aja_i=a_j 的两个数划去的操作的最多操作次数。

我们从 ai=aja_i=a_j 这个条件入手。可以发现,每两个相同的数都可以划去,也就是说,如果一个数有 nn 个,那么最多能划 n2\left\lfloor\\\dfrac{n}{2}\right\rfloor 次(因为如果是奇数的话最后余下的一个无法划去)。

那么这个问题就简单了。我们只需要统计每个数出现的次数,然后对于每个数,将其出现的次数除以二向下取整并求和就可以了。现在这个问题就被分为了两部分。

  • 统计每个数出现的次数。由于 aia_i 范围较大,可以使用数据结构 map 来统计。
  • 获得数组中出现的不重复的数。对此,可以使用 STL 的 unique 函数进行去重。

按照上述步骤实现即可,注意 unique 函数使用前要排序。

关键代码

int a[N];
map <int, int> mp; //统计每个数出现的次数的数据结构 map
 
int main()
{
	int n, cnt = 0;
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		mp[a[i]]++; //统计每个数出现的次数
	}
	sort(a + 1, a + n + 1); //排序
	int p = unique(a + 1, a + n + 1) - a - 1; //去重并获得不重复数的个数
	for(int i = 1;i <= p;i++)
	{
		cnt += (mp[a[i]] / 2); //对于每个数,将其出现的次数除以二向下取整并求和
	}
	cout << cnt << endl;
	return 0;
}
posted @ 2023-03-27 19:54  邻补角-SSA  阅读(10)  评论(0)    收藏  举报  来源