题目
http://acm.hdu.edu.cn/showproblem.php?pid=4223
分析
这个没有什么好的思路,就是按照题目要求一段一段的,把每种可能都计算了(即,在每一个起点的位置上按照步长进行分段来求值),然后求最小值,步长取值范围[1,N-1]。
复杂度
O(N*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;
}
参考文献