69,371
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
int main()
{
int n,i,j,k=0,K,sum=0,SUM=0,end=0,start=1,flag=0,T=0,J;
int a[100000];
while((scanf("%d",&n))!=EOF)
{k=0;end=0;start=1;
while(n--)
{ SUM=0;end=0;start=1;
scanf("%d",&a[0]);
for(i=1;i<=a[0];i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=a[0];i++)
{
K=a[i];sum=0;
if(K>=0) end++;
if(a[i]<0)
{
int t=0;
sum=a[i];
for(j=i+1;sum<=0&&j<=a[0];j++)
{
sum=sum+a[j];t++;
}
if(sum<=0) {sum=0;K=0;flag=-t-1;}
i=j-1;
K=0;
end=i+flag;
flag=0;
}
SUM=SUM+sum+K;
}
T=0;
for(J=a[0];J>=0;J--)
{
if(a[J]==0) T++;
else break;
}
if(T==a[0]-J) end=end-T;
k++;
printf("Case %d:\n",k);
if(a[1]==0&&SUM==0) {end=1;start=1;}
if(SUM==0&&sum==0) {end=0;start=0;}
printf("%d %d %d\n\n",SUM,start,end);
}
}
return 0;
}
#include<stdio.h>
int main()
{
int t,j;
scanf("%d",&t);
for(j=0;j<t;j++){
int a[100000];
int start=0,end=0,SUM=-0x7fffffff,sum=-0x7fffffff,n,s=-1,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
if(sum>=0) sum+=a[i];
else if(sum<a[i]){
s=i;
sum=a[i];
}
if(sum>SUM){
SUM=sum;
start=s;
end=i;
}
}
printf("Case %d:\n",j+1);
printf("%d %d %d\n",SUM,start+1,end+1);
if(j!=t-1) printf("\n");
}
return 0;
}
//下面的代码能够AC这个问题
Problem : 1003 ( Max Sum ) Judge Status : Accepted
RunId : Language : G++ Author :
#include <iostream>
using namespace std;
int max_sum(int* data, int n, int& s, int& e)
{
int ans = -2147483640, curr = 0;
int start = 0, end = 0;
for (int i = 0, j = 0; i < n; ++i)
{
curr += data[i];
if (curr > ans) ans = curr, s = j, e = i;
if (curr < 0) curr = 0, j = i + 1;
}
return ans;
}
int data[100005];
int main()
{
int cas;scanf("%d", &cas);
for (int curr = 1; curr <= cas; ++curr)
{
if (curr > 1) puts("");
int n, s, e;scanf("%d", &n);
for (int i = 0; i < n; ++i)scanf("%d", data+i);
printf("Case %d:\n%d", curr, max_sum(data, n, s, e));
printf(" %d %d\n", s+1, e+1);
}
return 0;
}
#include<stdio.h>
int main()
{
int n,i,j,k=0,K,sum=0,SUM=0,end=0,start=1,flag=0;
int a[100000];
if((scanf("%d",&n))!=EOF)
{
while(n--)
{ SUM=0;end=0;start=1;
scanf("%d",&a[0]);
for(i=1;i<=a[0];i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=a[0];i++)
{
K=a[i];sum=0;
if(K>=0) end++;
if(a[i]<=0)
{
int t=0;
sum=a[i];
for(j=i+1;sum<=0&&j<=a[0];j++)
{
sum=sum+a[j];t++;
}
if(sum<=0) {sum=0;K=0;flag=-t-1;}
i=j-1;
K=0;
end=i+flag;
flag=0;
}
SUM=SUM+sum+K;
}
k++;
printf("Case %d:\n",k);
if(a[1]==0&&SUM==0) {end=1;start=1;}
if(SUM==0&&sum==0) {end=0;start=0;}
printf("%d %d %d\n\n",SUM,start,end);
}
}
return 0;
}
/*
设 f[i] 是 1 - i 的,包含 i 的,最大序列的和,那么:
f[1] = a[1];
f[i+1] = f[i] > 0 ? f[i] + a[i+1] : a[i+1]
继而,最大子序列和就是 f[1] .. f[n] 中最大的那一个。
*/
main()
{
// do something here
// ...
for (i = 1; i < n; i++)
{
if (max > 0)
{
max += a[i];
}
else
{
max = a[i];
start = i;
}
if (resMax < max)
{
resMax = max;
resStart = start;
resEnd = i;
}
}
// do something here
// ...
}