题目大意:
给定一个N个数字的序列。PMH和Roy玩一种游戏。Roy给出开始位置,PMH给出长度。Roy想要子序列的平均值最大,PMH想要子序列的平均值最小。计算Roy可以得到的最好结果,假定PMH足够聪明。
解题思路:
反证法。
其实就是找后几个数的平均值的最大值!! (贪心策略!要找对)
k=1,2,3……n ,记k以及k后面的数的平均值最大的那个k做maxk
一旦Roy选了这个maxk , PMH必定会将所选数字长度最大化
为什么呢??
用反证法证明:如果所选长度的最后一个数字不是最后一个数n, 而是maxk与n中间的某个数t
那么也就是说ave(maxk…t) < ave(maxk…n)
那么必有 ave(t+1…n) > ave(maxk…n) 说明t+1后面几个数的平均数最大 与题设矛盾
代码如下:
#include <stdio.h>
#define MAXNUM 10000
int main()
{
int n;
int t,sum,i;
int num[MAXNUM];
double max,ave;
while (scanf("%d",&n)!=EOF)
{
sum=0;
for (i=0;i<n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
max=sum*1.0/n;
t=n-1;
for (i=0;i<n-1;i++)
{
sum-=num[i];
ave=sum*1.0/t--;
if (ave>max)
max=ave;
}
printf("%.6f\n",max);
}
return 0;
}