• 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);
    }
    
  • 相关阅读:
    Yii隐藏单入口
    JS字符串的问题
    暑假第三测
    暑假第二测
    暑假第一测
    沈阳集训day4
    沈阳集训day3
    P2571 [SCOI2010]传送带
    CF626C Block Towers
    洛谷P4171 [JSOI2010]满汉全席
  • 原文地址:https://www.cnblogs.com/lukelmouse/p/11487798.html
Copyright © 2020-2023  润新知