Problem Statement
给你一个下标从 0 开始长度为 偶数 的整数数组
nums
。只要
nums
不是 空数组,你就重复执行以下步骤:
- 找到
nums
中的最小值,并删除它。- 找到
nums
中的最大值,并删除它。- 计算删除两数的平均值。
两数
a
和b
的 平均值 为(a + b) / 2
。
- 比方说,
2
和3
的平均值是(2 + 3) / 2 = 2.5
。返回上述过程能得到的 不同 平均值的数目。
注意 ,如果最小值或者最大值有重复元素,可以删除任意一个。
input
第一行有1个数,即整数数组的元素个数n
第二行有n个数,即整数数组的元素output
上述过程能得到的 不同 平均值的数目
先来看代码
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> arr;
set<float> ans;
int n1=n;
while(n1--){
int a=0;
cin>>a;
arr.push_back(a);
}
while(arr.size()){
auto iterMax=arr.begin();auto iterMin=arr.begin();
for(auto iter=arr.begin();iter!=arr.end();iter++){
if(*iter>*iterMax){
iterMax=iter;
}
if(*iter<*iterMin){
iterMin=iter;
}
}
for(auto i=arr.begin();i!=arr.end();i++){
cout<<*i;
}
cout<<endl;
float aver=(*iterMax+*iterMin)/2.0;
ans.insert(aver);
cout<<*iterMax<<' '<<*iterMin<<endl;
arr.erase(iterMax);arr.erase(iterMin);
cout<<endl;
}
cout<<ans.size();
}
Sample Input
6
4 1 4 0 3 5
sample input通过了,但是在后面的随机测试中并未通过。经检查,发现测试案例的输出为:
4 1 4 0 3 5 5 0 4 1 4 3 4 1 1 3 3 1 2
可以看到,erase删除的并非4和1,而是4和4;
所以erase(iterator position)在删除vector中的元素后,会将该元素的后面所有元素都往前挪一位。因此,原先的迭代器指向的元素就不是原来那个了,而是它的后一位元素。
所以,只需要将代码改为先删除后面的元素,再删除前面的元素,即可以避免迭代器指向错误的元素。
经过修改,代码成功通过。
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> arr;
set<float> ans;
int n1=n;
while(n1--){
int a=0;
cin>>a;
arr.push_back(a);
}
while(arr.size()){
auto iterMax=arr.begin();auto iterMin=arr.begin();
for(auto iter=arr.begin();iter!=arr.end();iter++){
if(*iter>*iterMax){
iterMax=iter;
}
if(*iter<*iterMin){
iterMin=iter;
}
}
float aver=(*iterMax+*iterMin)/2.0;
ans.insert(aver);
if(iterMax>iterMin){
arr.erase(iterMax);arr.erase(iterMin);
}else{
arr.erase(iterMin);arr.erase(iterMax);
}
}
cout<<ans.size();
}