杭电的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;
}