2020/11/25 div3 C (不排序使用unique的妙用)

题目:

Div3 C

主要的思想还是统计每个数字的出现次数,选择出现最少的元素的出现次数作为结果,在读入数字序列的时候要注意连续的两个位置,如果元素相同的话,就不用重复读入,对结果没有任何影响。(这里就用到了unique函数的另外一种用法,一般去重要先sort整个数列,保证有序,这里就不进行sort,直接使用unique函数,这样可以使得任何相邻的两个位置的元素都不会相同)

要注意在统计数字的出现次数的时候,开头和末尾的元素的出现都不会被统计。(因为开头的元素即使被选中也不会贡献划分的次数,末尾的元素同理)

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 20005;
int b[maxn];
 
int main()
{
    int t,n,ans;
    cin >> t;
    
	while(t--)
    {
        ans = 1e9;
        cin >> n;
        
		vector<int>a(n);
        
		for(auto &it: a)
            cin >> it;
        
		vector<int> res(n + 1, 1);
        
		n = unique(a.begin(), a.end()) - a.begin(); // 去掉所有连续的两个相同元素的其中一个,保证整个序列里面没有两个相同元素是相同的(不排序使用) 
        
		a.resize(n); // 重新规划a的空间为刚好无重复元素的大小 (只保留前 n 个没有相同元素的序列) 
        
		for(int i = 0; i < n; i++) // 先记录所有元素的出现次数 
        {
            res[a[i]]++;
        }
        
        res[a[n - 1]]--;
        res[a[0]]--; // 不记录开头的元素和末尾的元素 
        
		for(int i = 0; i < n; i++) // 选择当前出现次数最少的元素的出现次数作为结果 
        {
            ans = min(ans, res[a[i]]);
        }
        
        cout << ans << endl;
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值