一种解题思路,首先通过一次排序,在进行操作
/*
原来思路:每输入一个数,然后就向前历编一次,最后求出最小值
*/
#include <cstdio>
#define abs(a) ((a)>=0?(a):-(a))
const int nMax=1010;
int T,N,Ni[nMax];
const int INF=0x7fffffff;
int main()
{
//freopen("f://data.in","r",stdin);
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
int min=INF;
scanf("%d",&N);
for(int j=0;j<N;j++)
{
scanf("%d",&Ni[j]);
int sum=Ni[j];
if(abs(sum)<min)
min=abs(sum);
for(int k=j-1;k>=0;k--)
{
sum+=Ni[k];
if(abs(sum)<min)
min=abs(sum);
}
}
printf("Case %d: %d\n",i,min);
}
return 0;
}
//改进算法。推荐!!!
//思路:求出前N个数之和,用数组进行存储,最后从小到大进行排序,然后求解。
#include <cstdio>
#include <cstdlib>
#define abs(a) ((a)>=0?(a):-(a))
const int nMax=1010;
const int INF=0x7fffffff;
int T,N;
int e[nMax];
int cmp(const void *a,const void *b)
{
int *pa=(int *)a;
int *pb=(int *)b;
return *pa-*pb;
}
int main()
{
//freopen("f://data.in","r",stdin);
scanf("%d",&T);
for(int cas=1;cas<=T;cas++)
{
scanf("%d",&N);
e[0]=0;
for(int i=1;i<=N;i++)
{
int a;
scanf("%d",&a);
e[i]=e[i-1]+a;
}
qsort(e+1,N,sizeof(e[0]),cmp);
int min=INF;
for(int i=1;i<=N;i++)
{
if(abs(e[i])<min)
min=abs(e[i]);
if(abs(e[i]-e[i-1])<min)
min=abs(e[i]-e[i-1]);
}
printf("Case %d: %d\n",cas,min);
}
return 0;
}