CF ECR124-C Fault-tolerant Network

Problem - C - Codeforces

题目大意:两个一维数组,分别代表网络A和网络B的n台计算机,A网,B网线性连接,现在要求在A和B之间连上几条网线,让AB合并成一个网络,A的i机器和B的j机器连接代价是abs(a[i]-b[j]),并且让新网络删除任何一台计算机后仍保持连通,求最小连接代价。

解题思路:让一台计算机不连通,那么就得删除它的邻接点,实际上只有4台计算机邻接点数量是1(度为1),即a[1],a[n],b[1],b[n],如果整个AB网络已经连通,那么其他计算机无论删除那一个点都一定会保持连通,这些点不需要去考虑,只考虑a[1],a[n],b[1],b[n],让这4台机器多于一条边。枚举所有连接方式,寻求最小代价。因为漏掉一种情况,我在做这个枚举时花费了很长时间无法通过。边界情况的处理需要多做多练。

也许有更好的作法,我是用的是笨办法................. 

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int get(int a[],int l,int r,int v)
{ /**< 数组l到r范围间,找到和v绝对值差最小的结果 */
    int minv=1e9;
    for(int i=l;i<=r;i++)
        minv=min(minv,abs(v-a[i]));
    return minv;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        int a[n+5],b[n+5];
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=n;i++)
            cin>>b[i];
        ll l1=get(b,2,n,a[1]),r1=get(b,1,n-1,a[n]);
        ll l2=get(a,2,n,b[1]),r2=get(a,1,n-1,b[n]);
        ll s1=l1+l2+r1+r2,s2=abs(a[1]-b[1])+r1+r2,s3=l1+l2+abs(a[n]-b[n]);
        ll spj=min(abs(a[1]-b[n])+abs(a[n]-b[1]),abs(a[1]-b[1])+abs(a[n]-b[n]));
        spj=min(spj,l1+r2+abs(a[n]-b[1]));
        spj=min(spj,l2+r1+abs(a[1]-b[n]));
        cout<<min(spj,min(s1,min(s2,s3)))<<endl;
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值