• 问题 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;
    }
    
  • 相关阅读:
    css选择器解析规则
    swiper轮播图包含视频或图片
    css实现文字选中变色
    swiper鼠标滚轮事件
    C语言中,关于相除的问题
    输入测试字符型数据的组数,再输入字符型数据,排坑
    C语言中,字符型数字与常数型数字的加减实现
    C语言的指针用法:输入一堆字符,把非字母的删去。
    C语言中倒序输出你输入的数。
    C语言中,嵌套的if语句的一些经验...
  • 原文地址:https://www.cnblogs.com/-yjun/p/10586320.html
Copyright © 2020-2023  润新知