杭电ACM 1003

C++:


#include<iostream>
#include<vector>
using namespace std;
void maxSum();

int main()
{
   int T=0;
   cin>>T;
   if(T<1||T>20)return 0;
   for(int i=0;i<T;i++)
   {
	   cout<<"Case "<<(i+1)<<":"<<endl;
	   maxSum();
	   if(i<T-1)cout<<endl;
   }
   cin>>T;
   return 0;
}


void maxSum()
{
   int N=0;
   int data=0;
   long int sum=0;
   vector<int> temp;
   cin>>N;
   if(N<1||N>100000)return;
   for(int i=0;i<N;i++)
	  {
		  cin>>data;
		  if(-1000<=data<=1000)
		  {
		     temp.push_back(data);
		  }
		  else return;
      }
   int begin=0;
   int end=0;
   int presentBegin=0;//当前起始点
   int max=temp[0];

   for(int j=0;j<temp.size();j++)
   {
	   sum+=temp[j];
	   if(sum>=0)//=0是输出第一个满足条件的子数组的条件
	   {
		   if(sum>max){max=sum;begin=presentBegin;end=j;}

	   }
	   else{
		     if(sum>max){max=sum;begin=presentBegin;end=j;} 
		     presentBegin=j+1;sum=0;
	   }
   }
   cout<<max<<" "<<(begin+1)<<" "<<(end+1)<<endl;


}
  C:


#include<stdio.h>
int main()
{
	int j,n,t,i,sum[100001],f[100001],max,flag1,flag2;
	scanf("%d",&n);
	for(j=1;j<=n;j++)
	{
		printf("Case %d:\n",j);
		scanf("%d",&t);
		for(i=0;i<t;i++)
			scanf("%d",&f[i]);
		sum[0]=f[0];
		max=f[0];
		flag1=0;
		flag2=0;
		for(i=1;i<t;i++)
		{
			if(sum[i-1]>=0)
			{
				sum[i]=sum[i-1]+f[i];
				if(sum[i]>max)
				{
					flag1=i;
					max=sum[i];
				}
			}
			else
			{
				sum[i]=f[i];
				if(sum[i]>max)
				{
					max=sum[i];
					flag1=i;
				}
			}
		}
		for(i=flag1;i>=0;i--)
			if(sum[i]<0)
				break;
		if(max>=0)
			printf("%d %d %d\n",max,i+2,flag1+1);
		else
			printf("%d %d %d\n",max,i+1,flag1+1);
		if(j!=n)
			printf("\n");
	}
	return 0;
}



你可能感兴趣的:(杭电ACM 1003)