HOJ 1003 Max Sum 解題報告

好幾年沒有做ACM了,感覺忘得差不多了,這個做着做着就打瞌睡了!言歸正傳,下面是我的解題思路:

首先的話,我們可以畫一個函數圖,以輸入數組的下標爲X軸,以數組的和爲Y軸,當數組和小於零時,我們使用備用的數組和sum2和備用的最小下標min2,並用flag進行標記。具體實現可以參考代碼。

需要注意的地方有:當數組所有值都小於零時,我們在此進行特別的處理,找出最小的負數和相應的下標,然後在輸出時和非全負數組的結果分開。(第一次提交的時候,沒有考慮到全負的情況,WA了一次)

#include <stdio.h>

int main()
{
	int n,num,i,c;
	int min1,min2,max,sum1,sum2,temp,flag;
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);
	scanf("%d",&n);
	for(c=1; c<=n; c++)
	{
		scanf("%d",&num);
		flag = sum1 = sum2 = 0;
		min1 = min2 = max  = 1;
		int m, s, f=0;
		for(i=1; i <= num; i++)
		{
			scanf("%d",&temp);
			if(temp >= 0)f=1;
			
			if(1 == i){
				m = temp;
				s = i;
			}		
			else if(0 == f && temp > m){
				m = temp;
				s = i;
			}
			
			if(flag)		//if sum2 < 0, then execute follow action. 
			{
				if(temp >= 0)
				{
					sum2 = temp;
					min2 = i;
					flag = 0;
				}
				else{
					continue;
				}
			}else{
				sum2 += temp;
			}
			
			if(sum2 >= sum1)
			{
				max = i;
				sum1 = sum2;
				min1 = min2;
				
			}
			else if(sum2 < 0)
			{
				flag = 1;
			}
		}
		printf("Case %d:\n",c);
		if(1 == f){
			printf("%d %d %d\n",sum1,min1,max);
		}
		else{
			printf("%d %d %d\n",m,s,s);
		}
		if(c < n)printf("\n");
	}
	
	return 0;
}




發佈了33 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章