解题思路:看代码
#include<bits/stdc++.h>
#define MAX 100001
using namespace std;
using gg = long long;
gg n;
gg arr[MAX];
gg dp[MAX];//去除最小值后 后面数的和
gg min_num=1e9;
double max_avg;//最大平均值
unordered_map<int,double> mp;//去掉前i个值的平均值,i->avg,用这个是因为它比较快,不用排序
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
dp[2] = arr[n-1]+arr[n-2];
min_num = min(arr[n-1],arr[n-2]);
dp[2]-=min_num;
mp[n-2] = dp[2]*1.0;
max_avg = dp[2]*1.0;
gg cur;
for(int i=3;i<n;i++)
{
//从后往前扫描,当前数和最小值进行比较
cur = arr[n-i];
if(cur<min_num)
{
dp[i]=dp[i-1]+min_num;
min_num = cur;
}
else
{
dp[i]=dp[i-1]+cur;
}
double temp = dp[i]*1.0/(i-1); //去掉i个数之后的平均值
mp[n-i] = temp;
//cout<<temp<<endl;
if(temp>max_avg&&fabs(temp-max_avg)>1e-6)//与当前最大平均值进行比较
{
max_avg = temp;
}
}
vector<int> ans;
for(auto it=mp.begin();it!=mp.end();it++)
{
int num = it->first;
double temp = it->second;
if(fabs(temp-max_avg)<1e-6)
{
ans.push_back(num);
}
}
sort(ans.begin(),ans.end());//把答案进行升序排列,不然最后一个点会错
for(int i=0;i<ans.size();i++)
{
cout<<ans[i]<<"\n";
}
return 0;
}