B. All Distinct

题目:

样例:

 

输入
4
6
2 2 2 3 3 3
5
9 1 9 9 1
4
15 16 16 15
4
10 100 1000 10000

输出
2
1
2
4

 

解题思路:

        这道题很好玩,单纯思维题,我们找一下规律,题目要求咱们  通过删除 两个元素 来达到符合 不能有 i < j && a[i] == a[j]   并且选择删除的时候,尽量使得数组最长

在这里我们看一下规律,我们可以发现,通过删除之后,剩下的元素一定是 单独唯一的,并且删除的时候,我们的删除次数一定是 偶数

代码详解如下:

#include <iostream>
#include <cstring>
#include <unordered_map>
#define endl '\n'
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

inline void solve()
{
	bool r[N];	// 用于记录我们 元素是否出现过
	memset(r, false, sizeof r);	// 初始化

	int n ;
	cin >> n;
	int ans = n;		// 假定结果数组长度最长 为初始长度

	int sum = 0;	// 记录删除次数

	for (int i = 0, x; i < n; ++i)
	{
		cin >> x;
		if (!r[x])	// 如果没出现过
		{
			r[x] =  true;	// 标记出现
		}
		else
		{
			ans--;	// 删除该重复元素
			sum++;	// 累加删除次数
		}
	}
	if (sum % 2)
		ans--;	// 如果删除次数为 单数,那么我们任意删除其中一个

	//输出答案

	cout << ans << endl;

}


int main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值