P4086 [USACO17DEC]My Cow Ate My Homework

题目描述

In your bovine history class, you have been given a rather long homework assignment with NNquestions (3 \leq N \leq 100,0003N100,000), each graded with an integer score in the range 0...10,000. As is often customary, your teacher plans to assign a final grade by discarding a question on which you received the lowest score and then averaging the remaining scores together. Unfortunately, your pet cow Bessie has just eaten your answers to the first KK questions! (KK could be as small as 1 or as large as N-2N2).

After copious explanation, your teacher finally believes your story, and agrees to grade the remaining non-eaten part of the assignment the same way as before -- by removing the lowest-scoring question (or one such question, in the event of a tie) and averaging the rest.

Please output all values of KK which would have earned you the maximum possible score according to this grading scheme, in sorted order.

在你的历史课上,你得到了一个很长的作业。这个作业包含了N个题目(3 ≤ N ≤ 100,000),每个题目的成绩在0~10,000之间。

按照惯例,你的老师按照以下方式计算最终成绩:去掉你最低的一个成绩,然后将其余成绩的平均成绩作为最终成绩。但不幸的是,你的宠物牛“贝西”刚刚吃了前K个题目的答案!(1 ≤ K ≤ N-2)

经过你的一番解释,老师终于相信了你的故事,并且同意对你有答案的题目(没有被吃掉答案的题目)像之前一样给分——通过去掉最低的成绩(如果有多个最低成绩,则只去掉其中一个)并取剩余成绩的平均成绩。

根据这一成绩计算方案,请按升序输出所有可以使你最终成绩最高的K的值。

输入格式

The first line of input contains NN, and the next line contains the scores on the NN homework questions.

输出格式

Please output, one value per line, all values of KK which would have earned you the maximum possible score.

输入输出样例

输入 #1
5
3 1 9 2 7
输出 #1
2

说明/提示

If Bessie eats the first two questions, then the remaining scores are 9, 2, and 7. Removing the minimum and averaging, we get a final grade of 8, which is the highest possible.

#include<bits/stdc++.h>
using namespace std;
const int N=100005;

int n;
int a[N];
int mn[N];
int pre[N];
double ans[N];

int gi(){
  int ans=0,f=1;char i=getchar();
  while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}
  while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}
  return ans*f;
}

int main(){
  n=gi(); double ave = 0 , mx;
  memset(mn,127,sizeof(mn));
  for(int i=1;i<=n;i++) a[i]=gi(),pre[i]=pre[i-1]+a[i];
  for(int i=n;i>=1;i--) mn[i]=min(mn[i+1],a[i]);
  for(int i=1;i<n;i++){
    if(ave<=(pre[n]-pre[i]-mn[i+1])*1.0/(n-i-1)){
      ave=(pre[n]-pre[i]-mn[i+1])*1.0/(n-i-1);
      mx=ave; ans[i]=ave;
    }
  }
  for(int i=1;i<=n;i++)
    if(ans[i]==mx) printf("%d\n",i);
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/hrj1/p/11774711.html
my