NYOJ 422 字串和之差
2015-08-05 10:08
218 查看
字串和之差 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 给出一个数列{a1,a2,a3,a4……an},选出一个连续非空子序列,使该序列的绝对值max最大,再选出一个非空子序列(与第一个序列的选择无关),使该序列的绝对值min最小。输出max与min的差值。 输入 第一行是一个整数m(m<8)表示测试数据的组数。 每组数据第一行是一个整数 n(n<1000000),表示这个数列元素的个数,接下来一行是n个整数x(-100<x<100)。 输出 输出max与min的差值(max-min).每组数据输出占一行。 样例输入 2 4 -1 1 3 2 5 2 3 -2 4 1 样例输出 6 7 #include<stdio.h> #include<stdlib.h> #include<math.h> int sum[1000005]; int cmp(const void*a,const void *b) { return(*(int *)a-*(int *)b); } int main() { int T,n,i,max,min,a; scanf("%d",&T); while(T--) { scanf("%d",&n); scanf("%d",&a); sum[0]=a; for(i=1;i<n;i++) { scanf("%d",&a); sum[i]=sum[i-1]+a;//sum中的每一项表示前几项之和 } qsort(sum,n,sizeof(sum[0]),cmp);//对sum中的每一项进行由小到大排序 max=fabs(sum[0]);//对max赋值sum的第一项 if(max<fabs(sum[n-1]))//当数列的值都为正值时,其实求出的是连续数列的最大值 max=fabs(sum[n-1]); if(max<fabs(sum[n-1]-sum[0]))//当数列中有负值时,找出连续数列的最大值 max=fabs(sum[n-1]-sum[0]); //已找到max min=fabs(sum[0]); for(i=1;i<n;i++) { if(min>fabs(sum[i]-sum[i-1]))//找出原数列中连续情况的最小值 min=fabs(sum[i]-sum[i-1]); if(min>fabs(sum[i]))//排除为sum[0]=0的情况 min=fabs(sum[i]); } printf("%d\n",max-min); } return 0; } 思路详解:使用动态规划可能要简便一些,如上
相关文章推荐
- 矩阵中的路径
- C语言中的volatile关键字
- org.hibernate.util.ReflectHelper.getConstructor 空指针异常
- 理解SVG坐标系统和变换: transform属性
- Can you find it?
- Java 反射机制
- js继承如何实现继承?
- 上传大文件问题 413 (Request Entity Too Large)
- Program received signal SIGUSR1, User defined signal 1.解决方法
- linux环境安装Nginx
- [乐意黎原创] php 页面提示 Fatal error: Call to undefined function curl_init()
- HTML 列表中的dl,dt,dd,ul,li,ol区别及应用
- JSP基本语法
- Java多线程——<三>简单的线程执行:Executor
- velocity问题积累
- 南邮 OJ 1151 Find Your Present
- 开启“自修”模式
- 南邮 OJ 1150 整除的尾数
- JavaScript的作用域与作用域链
- for_each的用法