【ACM】杭电OJ 1003。

运行环境VS2017 

题目链接:杭电OJ 1003

主要思想是:

用d[i]来存放前i项中最大的和,得到end,然后再倒推,得起始的位置begin

然而在程序42行的疑问,大家可以讨论一下吗????

#include 
#include 
int a[100000 + 11];
int d[100000 + 11];
int main()
{
	int N,n,i,end,begin,inf,sum,p;
	scanf_s("%d", &N);
	for (p = 1; p <= N;p++)
	{
		inf = -1999;
		memset(a, 0, sizeof(a));
		memset(d, 0, sizeof(d));
		scanf_s("%d", &n);
		for(i=1;i<=n;i++)
		{
			scanf_s("%d", &a[i]);
			if (a[i] + d[i - 1] > a[i])
			{
				d[i] = a[i] + d[i - 1];
			}
			else
			{
				d[i] = a[i];
			}
			if (d[i] > inf)
			{
				inf = d[i];
				end = i;
			}
		}
		sum = 0;
		for (i = end; i >= 1; i--)
		{
			sum += a[i];
			if (sum == inf)
			{
				begin = i;
			}
		}
		printf("Case %d:\n",p);
		printf("%d %d %d\n", inf, begin, end);//改成inf就是AC,改成sum就是WA????
		if (p != N)
		{
			printf("\n");
		}
	}
	return 0;
}

 

你可能感兴趣的:(ACM,算法)