电话线

乐乐养的兔子中有 N 头超级兔子(4<=N<=12,N 为偶数),为了提高它们的待遇,乐乐打
算给它们安装电话系统,以方便它们交流。
每个兔子正好有其他 3 个在畜棚里的朋友, 每个兔子占了 N 个排成一排的畜栏中的一
个。 一个长度为 L 的电线需要 L 单位的电线, 所以如果畜栏 4 和畜栏 7 的兔子为朋友, 那
么需要 3 个单位的电线来造一个电线将他们连在一起。
假设每对朋友必须用单独的电线连接, 那么当乐乐将它们按最优的方法排列后,最少
需要多少单位的电线。
输入格式:
第一行: 一个整数 N,兔子们,编号从 1 到 N。
第 2-1+N 行: 每一行包含三个用空格隔开的整数, 每个整数在 1-N 范围内。 第 i+1 行包
含了和第 i 号兔子朋友的三个朋友的编号。 如果第 i 个兔子和第 j 个兔子为朋友,那么第 j
个兔子也和第 i 个兔子为朋友。
输出格式:
第一行: 输出将所有对朋友兔子连接在一起最少需要多少单位的电线。

输入样例 (haywire.in) :

6

6 2 5

1 3 4

4 2 6

5 3 2

4 6 1

1 5 3

输出样例 (haywire.out) :

17

 

 

这题是真的秀...

本人表示只会暴力,考试打了个暴力,结果标程用个随机排列过了....

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define R register
using namespace std;
int pa[20];
int f[20][4];
int n;int ans=1000000;
int w[20];
int main()
{
    freopen("haywire.in","r",stdin);
    freopen("haywire.out","w",stdout);
    cin>>n;
    for(R int i=1;i<=n;i++) pa[i]=i;
    R int t;
    for(R int i=1;i<=n;i++)
        for(R int j=1;j<=3;j++)
        {
            cin>>t;
            if(t<i) f[i][++f[i][0]]=t;
        }
    R int sum;
    for(R int i=1;i<=250000;i++)
    {
        sum=0;
        random_shuffle(pa+1,pa+1+n);
        for(R int i=1;i<=n;i++) w[pa[i]]=i;
        for(R int i=1;i<=n;i++)
            for(R int j=1;j<=f[i][0];j++)
                sum+=abs(w[i]-w[f[i][j]]);
        if(sum<ans) ans=sum; 
    }
    cout<<ans<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/000226wrp/p/11339510.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值