P4086 [USACO17DEC]My Cow Ate My Homework S(静态数据预处理:后缀和、后缀最小值)

P4086 [USACO17DEC]My Cow Ate My Homework S(静态数据预处理:后缀和、后缀最小值)

原题戳这里

题解

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000010;

int n, a[N], bsum[N], bmin[N], k;
double res[N], mval;    //这里一定要是double啊,不能是int的!!!

int main(){
    cin >> n;
    for (int i = 1 ; i <= n ; i ++ ) cin >> a[i];
    for (int i = 1 ; i <= n + 1 ; i ++ ) bmin[i] = 100000010;//后缀最小值数组的预处理!!!
    for (int i = n ; i >= 2 ; i --){
        
        //后缀和
        bsum[i] = bsum[i + 1] + a[i];                     
        //处理“后缀最小值”,dp思想
        bmin[i] = min(bmin[i + 1], a[i]);
        
        if (i != n) res[i] = 1.0 * (bsum[i] - bmin[i]) / (n - i);
        mval = max(mval, res[i]);//记录最大值
        
    }
    for (int i = 2 ; i <= n - 1 ; i ++)
        if (res[i] == mval) cout << i - 1 << endl;//endl换行!!!不是空格!!
    
    
    return 0;
}

坑点:(还是不是自己太菜才被坑QAQ)

  1. 答案输出是换行,不是空格!!!!!
  2. mvalres[i]都是double类型,而不是int类型!!!!!

亮点:

  1. 后缀和:得到该位置到一直后面的和,如bsum[i]a[i] + a[i + 1] ... + a[n]的值
  2. 后面元素的最小值:可以理解为“后缀最小值”,BUT!!注意把数组先全部预处理成很大很大!!!!bmin[i]就表示a[i], a[i + 1], ... , a[n]里面的最小值,利用dp的思想求得bmin数组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值