一种解题思路,首先通过一次排序,在进行操作
/*
原来思路:每输入一个数,然后就向前历编一次,最后求出最小值
*/
#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;
}
改进算法求最小绝对值和
本文介绍了一种改进的算法来求解一系列整数中任意连续子序列的最小绝对值和。通过预处理和排序的方法,提高了原算法的效率。
968

被折叠的 条评论
为什么被折叠?



