【题解】AT_abc295_c 题解
AT_abc295_c 题解
思路分析
一道简单思维题。
首先,我们要求每次将满足 的两个数划去的操作的最多操作次数。
我们从 这个条件入手。可以发现,每两个相同的数都可以划去,也就是说,如果一个数有 个,那么最多能划 次(因为如果是奇数的话最后余下的一个无法划去)。
那么这个问题就简单了。我们只需要统计每个数出现的次数,然后对于每个数,将其出现的次数除以二向下取整并求和就可以了。现在这个问题就被分为了两部分。
- 统计每个数出现的次数。由于 范围较大,可以使用数据结构 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;
}

浙公网安备 33010602011771号