P4086 [USACO17DEC]My Cow Ate My Homework S

在这里插入图片描述

在这里插入图片描述
解题思路:看代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值