Comet OJ

Comet OJ - Contest #10 B 沉鱼落雁

思维题

题意 : 每个数字最多重复出现三次,有n给数字,让你尽可能的使得相同数字之间的最小距离尽可能大

思路 :分三种情况套路

  • 设 a b c 分别代表出现 一次, 两次, 三次 数字的个数

  • 所有元素至多出现一次,答案为 n,题目规定

  • 所有元素至多出现两次,

    例如 1 1 2,可以排列成 1 2 1,所以,答案为 1

    例如 1 1 2 2 3,可以排列成 1 2 3 1 2,所有 答案为 2

    思考后得出,应该尽可能的把 b 个出现两次的数字 拆分合到一起,一部分放首,一部分放到尾巴,

    再把其他的数字放到中间, 所以答案,就是 b - 1 + a

  • 所有元素至多出现 三次

    例如 1 1 1 2 2 2 3 3 4, 1 2 1 2 1 2 ,先把出现三个元素的排好,然后把出现两个和一个的元素

    插空到 他们之间,所以只用算一个单格区间即可,c - 1 + b + a / 2

#include <iostream>
#include <map>
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n ,x,a = 0,b = 0,c = 0;
    map<int,int> m;
    cin >> n;
    for(int i = 0;i < n; ++i) {
        cin >> x;
        m[x]++;
    }
    for(auto i = m.begin(); i != m.end(); ++i){
        if(i->second == 1) a++;
        if(i->second == 2) b++;
        if(i->second == 3) c++;
    }
    if(a && b == 0 && c == 0) cout << n ;
    else if(a && b && c == 0) cout << b - 1 + a;
    else cout << (c - 1 + b + a/2);
}
原文地址:https://www.cnblogs.com/lukelmouse/p/11487798.html