【NOIP2016提高A组模拟9.9】闭门造车

Description

自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店。
一走进商店,玲琅满目的各式零件看得htn眼花缭乱。但是他很快便反应过来:我只要买一套好的零件就行。首先它们的性能差不能太大,否则汽车的兼容性不好,开着开着就损坏了;其次,当然是越便宜越好了!为了打造一辆顶级跑车,htn陷入了沉思……
现在商店中有 N 件零件,给出这 N 件零件的价格,其性能等于价格。htn要从中购买一套零件,即选取这个序列的一个子串(连续一段)。要求如下:
1、这一套零件个数要大于等于2(这才算一套)。
2、这套零件的性能差为首尾两个零件的性能差(htn觉得每一个都比较性能差实在是太累了)。
3、购买这套零件的价格和为它们各自价格的总和。
4、最终的总花费为 性能差²+价格和²。
5、由于商店最近有优惠活动,所以每一套零件的第一个都是免费的。对此毫无经验的htn只好向经验丰富的你求助了。

Input

第一行一个正整数 N ,表示零件个数。
第二行 N 个正整数, ai 表示第 i 个零件的价格(即性能)。

Output

一个正整数,表示最小花费。

Sample Input

5
6 10 9 8 3

Sample Output

34

Data Constraint

对于 30% 的数据, N≤1000。
对于 50% 的数据, N≤10000。
对于 100% 的数据, N≤100000。

比赛时の想法

当时想到的是如果要取一段4个连续的数a1,a2,a3,a4,那么a2,a3或a3,a4或a2,a3,a4一定最少有一个比这一段的值要小,所以我们确定了左端点后只用向右扩展4个数就可以了

贴代码

var
    a,sum:array[0..100005]of int64;
    i,j,k,l,n:longint;
    ans:int64;
begin
   // assign(input,'t1.in'); reset(input);
    readln(n);
    for i:=1 to n do
    begin
        read(a[i]);
        sum[i]:=sum[i-1]+a[i];
    end;
    ans:=maxlongint*10000000;
    for i:=1 to n-1 do
    begin
        for j:=i+1 to i+100 do
        begin
            if j>n then break;
            if sqr(sum[j]-sum[i])+sqr(a[j]-a[i])sqr(sum[j]-sum[i])+sqr(a[j]-a[i])
        end;
    end;
    writeln(ans);
  //  close(input);
end.

你可能感兴趣的:(数学)