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)
- 答案输出是换行,不是空格!!!!!
mval
和res[i]
都是double类型,而不是int类型!!!!!
亮点:
- 后缀和:得到该位置到一直后面的和,如
bsum[i]
为a[i] + a[i + 1] ... + a[n]
的值 - 后面元素的最小值:可以理解为“后缀最小值”,BUT!!注意把数组先全部预处理成很大很大!!!!
bmin[i]
就表示a[i], a[i + 1], ... , a[n]
里面的最小值,利用dp的思想求得bmin
数组