codeforces C. Sequence Transformation

题目链接

 

场上没有打出来啊,思路也一波三折,还是欠练了qwq

 

题目大意:给你一个长度为n的序列,每次可以选择连续的一段删去,问删到只剩相同数字x最少需要多少次操作

 

首先想的是统计出现次数,然后看头尾,特判一波,写的时候发现要给记录出现次数排序,然后思路就乱了

然后队友提醒应该考虑区间,所以想到去重(还有刚开始我用数组存的,每次还要memset想着铁超时啊,就很迷茫了)

最后就是先将数组a中数字用unique去重,然后在统计出现次数,对头尾进行特殊处理(即-1),最后找出最少的出现次数即可。

 

代码如下:

#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);
        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;
    }
 } 
View Code

 

posted @ 2020-11-25 10:55  LucyHolmes  阅读(89)  评论(0)    收藏  举报