zoj2091

题目大意:

给定一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值