码迷,mamicode.com
首页 > 其他好文 > 详细

江西理工大学编程俱乐部 2328 Star

时间:2019-03-16 16:56:05      阅读:600      评论:0      收藏:0      [点我收藏+]

标签:long   stream   printf   世界   tac   资源   情况下   lib   define   

2328: Star
时间限制: C/C++ 1 s      Java/Python 3 s      内存限制: 128 MB      答案正确: 9      提交: 26
 
题目描述
 



 

       31世纪,人类世界的科技已经发展到了空前的高度,星际移民,星际旅游早已经不再是问题。人类已经掌握了开发星系的能力。但是,无论发展到何种地步,资源一直是人们关注的重点。一种新的能源被人类掌握,通过它可以搭建虫洞,实现超光年传输。发展武器。但是虽然这种物质在宇宙海量的存在着,但它对于宇宙的稳定是至关重要的,若过量消耗这种物质,对于宇宙的稳定,星系与星系之间以及星系内部的微妙平衡都会产生巨大的影响。这种物质就是暗物质。

                                                                                                                                                                                                            -----《宇宙百科》节选

       现在,你所在的星系下有n个主星球居住着人民。为了星系内部的稳定与和平发展,现在需要在n个主星球之间建立空间虫洞,众所周知建立虫洞要消耗大量的暗物质,因此,你想要在n个主星球之间建立联系的情况下尽量少的消耗暗物质。目前你已经知道的是,建立虫洞所需要消耗的暗物质与两个星球之间的距离成正比,比例系数为k。并且,两个星球之间的距离为空间缩点距离。每个星球有它自己的三维物理坐标。不过,现在有一个好消息。你所在的星系掌握了一项新的技术,空间奇点压缩,简单来说就是降维,但是由于技术发展初期不够成熟,只能压缩一维。并且,任意两个主星球之间都可以选择是否进行空间奇点压缩。现在,你想知道,在这n个主星球之间建立连接需要花费的最少暗物质是多少。

     空间缩点距离:设两个n维坐标a(x1,x2,x3,,,,xn),b(y1,y2,y3,y4,,,yn).设距离为s,则s=abs((x1+x2+x3+…+xn)−(y1+y2+y3+…+yn));

                                                                                                                                                                                   ----以上内容纯属瞎扯,请忽略其真实性

输入
第一行两个整数n和k。(1≤n≤105,1≤k≤103)
接下开n行,每行三个整数x,y,z,其中第i行表示第i个星球在星系中的物理坐标。数据保证没有两个星球处于同一个位置上。(1≤x,y,z≤106)
输出
n个主星球之间建立连接需要花费的最少暗物质。

样例输入
3 2
1 1 6
1 2 9
3 20 8
样例输出
4
提示
样例说明:

星球1和星球2之间压缩第三维

星球2和星球3之间压缩第二维

来源
Ocean_star_T


 

 

 

 

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <string>
  5 #include <algorithm>
  6 #include <utility>
  7 #include <vector>
  8 #include <map>
  9 #include <queue>
 10 #include <stack>
 11 #include <cstdlib>
 12 #include <cmath>
 13 typedef long long ll;
 14 #define lowbit(x) (x&(-x))
 15 #define ls l,m,rt<<1
 16 #define rs m+1,r,rt<<1|1
 17 using namespace std;
 18 #define pi acos(-1)
 19 #define P pair<ll,ll>
 20 const ll N = 1e5+1000;
 21 ll n,k;
 22 ll cnt;
 23 int fa[N];
 24 void init()
 25 {
 26     for(int i =0;i<n;i++){
 27         fa[i] = i;
 28     }
 29     cnt=0;
 30 }
 31 struct Nod{
 32     ll x,y,z,num;
 33 }nod[N];
 34 struct Edge{
 35     ll fr,to,val;
 36 }e[N*5];
 37 bool cmp1(Nod a,Nod b)
 38 {
 39     return a.y+a.z<b.y+b.z;
 40 }
 41 bool cmp2(Nod a,Nod b)
 42 {
 43     return a.x+a.z<b.x+b.z;
 44 }
 45 bool cmp3(Nod a,Nod b)
 46 {
 47     return a.x+a.y<b.x+b.y;
 48 }
 49 bool cmp4(Nod a,Nod b)
 50 {
 51     return a.x+a.y+a.z<b.x+b.y+b.z;
 52 }
 53 bool cmp5(Edge a,Edge b)
 54 {
 55     return a.val<b.val;
 56 }
 57 int  find(int x)
 58 {
 59     return fa[x]=(x==fa[x]?x:find(fa[x]));
 60 }
 61 ll prim()
 62 {
 63     sort(e,e+cnt,cmp5);
 64     int ans=n;
 65     ll sum=0;
 66     for(int i =0;i<cnt;i++)
 67     {
 68         if(ans>1){        
 69         int x=find(e[i].fr),y=find(e[i].to);
 70         if(x!=y){
 71             fa[x] = y;
 72             ans--;
 73             sum+=e[i].val;
 74         }
 75     }
 76     }
 77     return  sum;
 78 }
 79 int  main()
 80 {
 81     scanf("%lld%lld",&n,&k);
 82     for(int i =0;i<n;i++){
 83         scanf("%lld%lld%lld",&nod[i].x,&nod[i].y,&nod[i].z);
 84         nod[i].num=i;
 85     }
 86     init();
 87     sort(nod,nod+n,cmp1);
 88     for(int i =0;i<n-1;i++)
 89     {
 90         e[cnt].fr=nod[i].num;
 91         e[cnt].to=nod[i+1].num;
 92         e[cnt++].val=abs((nod[i].y+nod[i].z)-(nod[i+1].y+nod[i+1].z));
 93     }
 94     sort(nod,nod+n,cmp2);
 95     for(int i =0;i<n-1;i++)
 96     {
 97         e[cnt].fr=nod[i].num;
 98         e[cnt].to=nod[i+1].num;
 99         e[cnt++].val=abs((nod[i].x+nod[i].z)-(nod[i+1].x+nod[i+1].z));
100     }
101     sort(nod,nod+n,cmp3);
102     for(int i =0;i<n-1;i++)
103     {
104         e[cnt].fr=nod[i].num;
105         e[cnt].to=nod[i+1].num;
106         e[cnt++].val=abs((nod[i].x+nod[i].y)-(nod[i+1].x+nod[i+1].y));
107     }
108     sort(nod,nod+n,cmp4);
109     for(int i =0;i<n-1;i++)
110     {
111         e[cnt].fr=nod[i].num;
112         e[cnt].to=nod[i+1].num;
113         e[cnt++].val=abs((nod[i].x+nod[i].y+nod[i].z)-(nod[i+1].x+nod[i+1].y+nod[i+1].z));
114     }
115     ll  ret = prim();
116     printf("%lld\n",ret*k);
117     return 0;
118 }

 

江西理工大学编程俱乐部 2328 Star

标签:long   stream   printf   世界   tac   资源   情况下   lib   define   

原文地址:https://www.cnblogs.com/tingtin/p/10542871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!