Comet OJ - Contest #10 B
Posted 317zhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comet OJ - Contest #10 B相关的知识,希望对你有一定的参考价值。
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);
以上是关于Comet OJ - Contest #10 B的主要内容,如果未能解决你的问题,请参考以下文章