贪心 hdu 1003

杭电的1003(贪心)

   他们都说这种算法叫贪心,额 ,为什么叫贪心呢?疑问接下来我们不讨论名字的来源,既然已经取了名字,那看看为啥叫贪心吧。大笑

  贪心问题,这一类的题都有一个共同的特点,就是要解决整个大问题,就要先一步一步解决,每一步解决的最优解就是整个算法的最优解。那。。。。这就好办了。

   接下来看这道题,题目要求我们算最大数。那我们就模拟一下,从第一个数开始,要算连续的最大值,我们就算和吧。如果加上下一个值得和小于0了,那我们就舍弃以前求的和,从当前开始算以后的和,继续加。就这样,一直算到最后,记录下每一步的和存入数组中。再遍历一下数组求出最大值,就是你要算的了。至于算从哪开始,从哪结束,再遍历一遍数组就行了。

  

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    int i, n, a[100100], b[100100], max, flag,start, end, t,sum,count;
    scanf("%d",&n);
    count = 1;
    while(n--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%d",&t);
        for(i = 0; i< t; i++) scanf("%d",&a[i]);

        for(i = 0,sum = 0; i < t; i++)
        {
            if(sum < 0) sum = a[i], b[i] = sum;
            else sum += a[i], b[i] =sum;
        }
        for(i = 0, max  = b[0], flag = 0; i < t; i++)
        {
            if(max < b[i]) max = b[i], flag = i;
        }
        end = flag +1;
        for(i = flag,start = flag; i>= 0 && b[i] >= 0; i--)  start = i;
        start ++;
        printf("Case %d:\n",count++);
        printf("%d %d %d\n",b[flag], start, end);
        if(n) printf("\n");
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值