问题 B: 合并车厢

题目描述
有很多节火车厢被分散在一条轨道上的若干个位置
第i节车厢在position[i]的位置,长度为length[i],也就意味着第i节车厢占据了{ position[i], position[i]+length[i] }这段区间
移动一节车厢一个单位长度需要消耗一个单位的能量,现在问你最少需要消耗多少能量能够将所有的车厢合并到一起,即任意两节车厢之间都没有间隙

输入
第一行先输入一个整数n (2 <=n <=50)
第二行输入n个整数 position[i] (1 <= position[i] <=10^9)
第三行输入n个整数 length[i] (1 <= length[i] <= 10^9)

输出
输出一个整数,表示需要消耗的最少能量

样例输入
【样例输入1】
4
1 3 10 20
2 2 5 3
【样例输入2】
3
100 50 1
10 2 1
【样例输入3】
5
4 10 100 13 80
5 3 42 40 9

样例输出
【样例输出1】
15
【样例输出2】
96
【样例输出3】
66

题意:合并区间,使其所有都合并成一个区间.
因为数据范围比较小,所以直接暴力.
题解:先按左端排序,枚举每一个车厢,以其为中心,两边的车厢向他靠拢.
#include <bits/stdc++.h>
using namespace std;
const int N=100;
typedef long long ll;
struct p{
    ll l,r;
}a[N];
typedef long long ll;
bool comp(p a,p b){
    return a.l<b.l;
}
int main(){
     ios::sync_with_stdio(false);
     int n;
     cin>>n;
     for(int i=1;i<=n;i++) cin>>a[i].l;
     for(int i=1;i<=n;i++){
        cin>>a[i].r;
        a[i].r+=a[i].l;
     }
     sort(a+1,a+1+n,comp);
     int end;
     ll ans=0;
     ll minn=1e18;
     for(int i=1;i<=n;i++){
        end=a[i].l;
        ans=0;
        for(int j=i-1;j>=1;j--){
            ans+=end-a[j].r;
            end-=a[j].r-a[j].l; 
         }
         end=a[i].r;
         for(int j=i+1;j<=n;j++){
            ans+=a[j].l-end;
            end+=a[j].r-a[j].l;
         }
         if(ans<minn) minn=ans;
     }
     cout<<minn<<endl;
      
     //cout<<"asf"<<endl;
     return 0;
}
posted @ 2019-03-23 23:44  _yjun  阅读(345)  评论(0编辑  收藏  举报