zoukankan      html  css  js  c++  java
  • 江西理工大学编程俱乐部 2328 Star

    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
    ",ret*k);
    117     return 0;
    118 }
  • 相关阅读:
    每日一水 POJ8道水题
    编译和使用 MySQL C++ Connector
    j2ee model1模型完成分页逻辑的实现 详解!
    DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号
    指向结构体变量的指针
    EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
    MybatisGen1.0 Mybatis JavaBean Mapper生成工具
    The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
    资源-Android:Android
    软件-开发软件:Android Studio
  • 原文地址:https://www.cnblogs.com/tingtin/p/10542871.html
Copyright © 2011-2022 走看看