http://acm.hdu.edu.cn/showproblem.php?pid=1003
只有这个代码能通过
input 4 -6 -8 0 -3
output 0 1 1
OJ有错误,连不正确的也AC
*/
#include <stdio.h>
int input[100000];
int main()
{
int i,j;
int start,end;
int x,y;
int b;
int n;
int max;
int cs,k;
int flag;
scanf("%d",&cs);
for(k=1;k<=cs;k++)
{
printf("Case %d:/n",k);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&input[i]);
x=0;y=0;
start=0;end=0;
max=-10000000;
b=0;
flag=0;
for(i=0;i<n;i++)
{
if(input[i]>=0)
{
if(flag==0)
{
max=0;
x=i;
}
flag=1;
}
if(flag==1)
{
if(b+input[i]<0)
{
b=0;
x=i+1;
}
else
{
b=b+input[i];
y=i;
}
if(max<b)
{
max=b;
start=x+1;
end=y+1;
}
}
else
{
if(max<input[i])
{
max=input[i];
start=i+1;
end=i+1;
}
}
}
printf("%d %d %d/n",max,start,end);
if(k!=cs) printf("/n");
}
return 0;
}
下面这两个没通过
input 4 -6 -8 0 -3
output 0 3 3
*/
#include <stdio.h>
#include <stdlib.h>
#define T 20
#define N 100000
int main()
{
int t,n,ca,cb,now,add,sub,flag,start,end,p1,p2;
int num[N]={0};
if(scanf("%d",&t)==1)
{
if(t>T)
return 0;
for(ca=0;ca<t;ca++)
{
printf("Case %d:/n",ca+1);
scanf("%d",&n);
p1=p2=start=end=flag=now=add=sub=0;
for(cb=1;cb<=n;cb++)
{
scanf("%d",&num[cb]);
switch(flag)
{
case 0:
if(num[cb]>=0)
{
now+=num[cb];
end=cb;
if(start==0)
start=cb;
}
else
{
if(end!=0)
{ flag=1;p1=cb;sub=num[cb];}
}
break;
case 1:
if(num[cb]>=0)
{
flag=2;p2=cb;
add=num[cb];
}
else
{
sub+=num[cb];
}
break;
case 2:
if(num[cb]>=0)
{
add+=num[cb];
}
else
{
if(add+sub+now<add)
{
start=p2-1;
end=cb-1;
now=add;
sub=add=0;
}
else
{
if(add+sub>0)
{
end=cb-1;
now+=add+sub;
sub=add=0;
}
else
{ end=p1-1;}
}
flag=1;
sub=num[cb];
p1=cb;
}
break;
}
}
if(flag==0 && end==0)
for(cb=1,start=end=1;cb<=n;cb++)
{
if(num[cb]>num[start])
{ end=start=cb;now=num[start];}
}
printf("%d %d %d/n",now,start,end);
if(ca!=t-1)
printf("/n");
}
}
return 0;
}
下面这个代码想法很好,但是没通过
GUN C++
*/
#include <iostream.h>
using namespace std;
const int NMAX=100000;
int main()
{
int t,n,ca,cb,i,j,sum,max,now;
while(cin>>t)
{
for(ca=1;ca<=t;ca++)
{
cin>>n;
sum=0;max=-2147483647;
for(cb=1;cb<=n;cb++)
{
cin>>now;
sum+=now;
if(sum>=0 && max<0)
{ i=cb;}
if(sum>max)
{ max=sum;j=cb;}
if(sum<0)
{ sum=0;}
}
cout<<"Case "<<ca<<":/n"<<max<<" "<<i<<" "<<j<<endl;
if(ca!=t)
cout<<endl;
}
}
return 0;
}
/*
思路:
变量start,end分别保存开始位置和结束位置,max保存上一次的最大值,sum表示当前和。
(1)找到sum>=0的值,即为start的值,然后比较sum和max,
(2)若sum>max,更新end的值;
(3)若sum<0;则令sum=0,从第(1)步重新开始
*/
int main()
{
int T;
cin>>T;
int i, j, start, end, max, sum, temp;
for(i=1; i<=T; i++)
{
int N;
cin>>N;
sum = 0;
max = -100000000;//让max=-100000000是用来判断 否是第一个使sum>=0的值 ,若是,则将对start赋值
for(j=1; j<=N; j++)
{
cin>>temp;
sum += temp;
if(sum < 0)
{
sum = 0; //若sum<0,不做任何处理,进行下一位操作
}
if((sum >= 0) && (max < 0))
{
start = j;
}
if(sum > max)
{
max = sum;
end = j;
}
}
printf("Case %d:/n", i);
printf("%d %d %d/n", max, start, end);
if(i != T)
{
printf("/n");
}
}
}