损失

【题目描述】

小苯有两个机器人在数轴上移动。初始时,两个机器人都位于位置 0。

数轴上会依次出现 n 个任务点,第 i 个任务点的坐标为 pi。

对于每个任务点,小苯必须选择其中一个机器人移动到该任务点(另一个机器人保持原地不动),并执行任务。

机器人移动的代价等于移动的距离,即从位置 x 移动到 y 的代价为 |x − y|。

小苯必须严格按照时间顺序(从第 1 个任务点到第 n 个任务点)依次执行所有任务。

你的任务就是求出:执行完所有 n 个任务所需的最小总代价。

【输入格式】

每个测试文件均包含多组测试数据。第一行输入一个整数 T (1 ≤ T ≤ 10) 代表数据组数。

对于每组测试数据:第一行输入一个整数 n (1 ≤ n ≤ 5000),代表任务点的数量。

第二行输入 n 个整数 p1, p2, . . . , pn (1 ≤ pi ≤ 109),代表任务点的坐标。

【输出格式】

对于每组测试数据,输出一个整数,表示最小总代价。

【样例输入】

2

3

1 2 3

4

1 5 2 8

【样例输出】

3

10

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){
    int T;
    cin>>T;
    while(T--){
        long long int n;
        cin>>n;
        long long int* p =new long long int[n+1]();
        long long int* a =new long long int[n]();
        for(long long int i=0;i<n;i++){
            cin>>p[i+1];
            if(i==0){
                a[i]=p[1];
            }else{
                long long int min=a[0]+p[i+1];
                for(int j=1;j<i;j++){
                    long long int temp=a[j]+labs(p[j]-p[i+1]);
                    if(min>temp){
                        min=temp;
                    }
                }
                a[i]=min;
                for(long long int j=0;j<i;j++){
                    a[j]+=labs(p[i+1]-p[i]);
                }
            }
        }
        long long int total=a[0];
        for(long long int i=1;i<n;i++){
            if(total>a[i]){
                total=a[i];
            }
        }delete[] p;
        delete[] a;
        printf("%lld\n",total);
    }return 0;
}

全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务