A37452. 数字游戏
填空题
困难
知识点
题目描述
数字游戏
题目描述
编程实现:数字游戏
老师给出了一组数,要求小蓝对这组数进行调整,调整的规则如下:
1. 第1次,从这组数中选出一个最小的数,把它调整为和第二小的数一样大;
2. 第2次,再从这组数中选出一个最大的数,把它调整为和第二大的数一样大;
3. 重复执行1、2步骤;
4. 当这组数中所包含的不同的数少于3个时,结束调整。
现在给定了一组数,请帮小蓝编写程序计算出总共的调整次数,以及调整结束时这组数中的最小数和最大数。
例1:
当这组数是 2 2 2 2时,这组数中所包含的不同的数少于3个(只有2这一种数),无需调整,最后输出:0 2 2
例2:
当这组数是 1 3 4 2时,调整过程如下:
1. 先将这组数中最小的数1,改成2,这组数变为:2 3 4 2
2. 再将这组数中最大的数4,改成3,这组数变为:2 3 3 2
这时,这组数中只包含2、3两个数了,满足规则4,调整结束,总共调整了2次,故最后输出:2 2 3
输入描述
第一行输入一个正整数N(3≤N≤1000000),表示这组数中数的个数
第二行输入N个正整数(1≤正整数≤1000000),正整数之间用一个空格隔开
输出描述
输出一行,包含三个整数,分别是总的调整次数、调整结束时的最小值和最大值,整数之间用一个空格隔开
样例输入
4
1 3 4 2
样例输出
2 2 3
参考答案
// 示例代码
#include <bits/stdc++.h>
using namespace std;
int n,ans;
map<int,int> mp; // 定义map容器mp用于计数,map容器会根据键自动进行排序
int main()
{
cin>>n; // 数的个数
for(int i=1,x;i<=n;i++){
cin>>x;mp[x]++; // 如果x已经存在,则val+1;否则新建一个键值对(x,1)
}
// 当mp中至少存在三个不同的数字时
while(mp.size()>2){
if(ans%2==0){ // 如果ans为偶数
auto t=mp.begin(); // 获取mp中第一个键值对的迭代器
(t->second)--; // 将出现次数最少的数x减去1
(next(t)->second)++; // 将出现次数比x大的数y加上1
if(!t->second) mp.erase(t); // 如果x的出现次数为0,则从mp中删除该键值对
}else{ // 如果ans为奇数
auto t=prev(mp.end()); // 获取mp中最后一个键值对的迭代器
(t->second)--; // 将出现次数最多的数x减去1
(prev(t)->second)++; // 将出现次数比x小的数y加上1
if(!t->second) mp.erase(t); // 如果x的出现次数为0,则从mp中删除该键值对
}
ans++;
}
int max_num = prev(mp.end())->first;
int min_num = mp.begin()->first;
cout<<ans<<" "<<min_num<<" "<<max_num<<endl;
return 0;
}答案解析
考察桶计数+双指针算法。
上一题
下一题