题解 P4086 【[USACO17DEC]My Cow Ate My Homework】
SuperJvRuo
2018-01-22 18:31:09
只需要注意实数运算的一些问题(如精度)即可AC
```cpp
#include<cstdio>
#include<cctype>
#define EPS 1e-6
//实数比较大小,要带EPS
inline int Read()//快读
{
int x = 0;char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c))
{
x = (x << 3) + (x << 1) + c - '0';
c = getchar();
}
return x;
}
double score[100005], minn[100005], grade[100005], maxn=0.0, sum=0.0;
int main()
{
int n=Read();
for (int i = 1; i <= n; ++i)
{
score[i] = Read();//记录每道题的得分
sum += score[i];//预处理得分总和
}
minn[n] = score[n];
for (int i = n - 1; i; --i)
minn[i] = score[i] < minn[i + 1] ? score[i] : minn[i + 1];
//minn数组代表[i,n]区间内的最低分
for (int i = 1; i <= n - 2; ++i)
{
sum -= score[i];
//此时的sum为[i + 1, n]区间内的分数和
grade[i] = (sum - minn[i + 1]) / (double)(n - i - 1);
maxn = grade[i] > maxn ? grade[i] : maxn;
//maxn代表最高平均得分
}
for (int i = 1; i <= n - 2; ++i)
{
if (maxn - grade[i] < EPS && maxn - grade[i] > - EPS)
//即maxn==grade[i]
printf("%d\n", i);
}
return 0;
}
```