字串和之差
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
给出一个数列{a
1,a
2,a
3,a
4……a
n},选出一个连续非空子序列,使该序列的绝对值max最大,再选出一个非空子序列(与第一个序列的选择无关),使该序列的绝对值min最小。输出max与min的差值。
-
输入
-
第一行是一个整数m(m<15)表示测试数据的组数。
每组数据第一行是一个整数 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
来源
- 原创 上传者
-
ACM_杨延玺
思路:这个题是让找的子序列,一是连续,二是绝对值,dp[i]表示的从第一项到第i项的和,这用到的一个技巧,就是加入了一个元素0这样全部是负的时候 0 - dp[0]就是最大值,全部是正的dp[n - 1] - 0也是最大值,有正有负dp[n - 1] - dp[0]就是最大值,求最小值时,排序完相邻的俩个的dp值的差应该是最近了,遍历一下找到最小的就好
ac代码#include<stdio.h> #include<string.h> #include<stdlib.h> #define INF 0xfffffff int dp[1000010]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int t; scanf("%d",&t); while(t--) { int i,num,max,min,n; dp[0]=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&num); dp[i]=dp[i-1]+num; } qsort(dp,n+1,sizeof(dp[0]),cmp); max=dp[n]-dp[0]; min=INF; for(i=0;i<n;i++) { if(min>dp[i+1]-dp[i]) min=dp[i+1]-dp[i]; } printf("%d\n",max-min); } }
-
第一行是一个整数m(m<15)表示测试数据的组数。