测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

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; }

答案解析

考察桶计数+双指针算法。

上一题 下一题