Just oj 2018 C语言程序设计竞赛(高级组)F:Star(结构体排序+最小生成树)
F: Star
Time Limit: 1 s Memory Limit: 128 MB
Submit My Status
Problem Description
31世纪,人类世界的科技已经发展到了空前的高度,星际移民,星际旅游早已经不再是问题。人类已经掌握了开发星系的能力。但是,无论发展到何种地步,资源一直是人们关注的重点。一种新的能源被人类掌握,通过它可以搭建虫洞,实现超光年传输。发展武器。但是虽然这种物质在宇宙海量的存在着,但它对于宇宙的稳定是至关重要的,若过量消耗这种物质,对于宇宙的稳定,星系与星系之间以及星系内部的微妙平衡都会产生巨大的影响。这种物质就是暗物质。
-----《宇宙百科》节选
现在,你所在的星系下有nn个主星球居住着人民。为了星系内部的稳定与和平发展,现在需要在nn个主星球之间建立空间虫洞,众所周知建立虫洞要消耗大量的暗物质,因此,你想要在nn个主星球之间建立联系的情况下尽量少的消耗暗物质。目前你已经知道的是,建立虫洞所需要消耗的暗物质与两个星球之间的距离成正比,比例系数为kk。并且,两个星球之间的距离为空间缩点距离。每个星球有它自己的三维物理坐标。不过,现在有一个好消息。你所在的星系掌握了一项新的技术,空间奇点压缩,简单来说就是降维,但是由于技术发展初期不够成熟,只能压缩一维。并且,任意两个主星球之间都可以选择是否进行空间奇点压缩。现在,你想知道,在这n个主星球之间建立连接需要花费的最少暗物质是多少。
空间缩点距离:设两个nn维坐标a(x1,x2,x3,,,,xn),b(y1,y2,y3,y4,,,yn)a(x1,x2,x3,,,,xn),b(y1,y2,y3,y4,,,yn).设距离为ss,则s=abs((x1+x2+x3+…+xn)−(y1+y2+y3+…+yn))s=abs((x1+x2+x3+…+xn)−(y1+y2+y3+…+yn));
----以上内容纯属瞎扯,请忽略其真实性
Input
第一行两个整数nn和kk。(1≤n≤105,1≤k≤103)(1≤n≤105,1≤k≤103)
接下开nn行,每行三个整数x,y,zx,y,z,其中第ii行表示第ii个星球在星系中的物理坐标。数据保证没有两个星球处于同一个位置上。(1≤x,y,z≤106)(1≤x,y,z≤106)
Output
nn个主星球之间建立连接需要花费的最少暗物质。
Sample Input
3 2
1 1 6
1 2 9
3 20 8
Sample Output
4
Hint
样例说明:
星球1和星球2之间压缩第三维
星球2和星球3之间压缩第二维
题解:通过排序找出不压缩、压缩X、压缩Y、压缩Z四种情况中相邻最近的两点,然后算出压缩后折算的距离并记录下来
然后再次排序,依次枚举直到连接完所有点,连接边长度的总和即为总距离,从而求出所需的暗物质
#include<iostream>
#include<string.h>
#include<algorithm>
#define maxn 100007
using namespace std;
int n,k,cnt;
int f[maxn];
struct sta{
int x,y,z,id;
}s[maxn];
struct P{
int st,ed,dis;
bool operator<(const P &a)const{
return dis<a.dis;
}
}p[maxn*4];
bool xyz(sta a,sta b){
return a.x+a.y+a.z<b.x+b.y+b.z;
}
bool xy(sta a,sta b){
return a.x+a.y<b.x+b.y;
}
bool yz(sta a,sta b){
return a.y+a.z<b.y+b.z;
}
bool xz(sta a,sta b){
return a.x+a.z<b.x+b.z;
}
void init()
{
cnt=0;
sort(s,s+n,xyz);
for(int i=1;i<n;i++)
p[cnt++]={s[i].id,s[i-1].id,s[i].x+s[i].y+s[i].z-(s[i-1].x+s[i-1].y+s[i-1].z)};
sort(s,s+n,xy);
for(int i=1;i<n;i++)
p[cnt++]={s[i].id,s[i-1].id,s[i].x+s[i].y-(s[i-1].x+s[i-1].y)};
sort(s,s+n,yz);
for(int i=1;i<n;i++)
p[cnt++]={s[i].id,s[i-1].id,s[i].y+s[i].z-(s[i-1].y+s[i-1].z)};
sort(s,s+n,xz);
for(int i=1;i<n;i++)
p[cnt++]={s[i].id,s[i-1].id,s[i].x+s[i].z-(s[i-1].x+s[i-1].z)};
sort(p,p+cnt);
}
int find(int x){
return f[x]=(x==f[x]?x:find(f[x]));
}
void kruskal()//找寻n个点连接的n-1条边的最小和(最小生成树)
{
for(int i=0;i<=n;i++)
f[i]=i;
int ans=0,num=n-1;//n-1条树枝
for(int i=0;i<cnt&#i++)
{
int a=find(p[i].st);
int b=find(p[i].ed);
if(a!=b){
f[a]=b;
num--;
ans+=p[i].dis;
}
}
printf("%d\n",ans*k);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].z),s[i].id=i+1;
init();
kruskal();
return 0;
}
Just oj 2018 C语言程序设计竞赛(高级组)F:Star(结构体排序+最小生成树)的更多相关文章
- Just oj 2018 C语言程序设计竞赛(高级组)D: 四边形面积
D: 四边形面积 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 有一个四边形,现在需要求它的面积 输入 输入四行,每行两个数整数xx, yy (1≤x,y ...
- Just oj 2018 C语言程序设计竞赛(高级组)H: CBT?
H: CBT? 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点. ...
- 2018年江西理工大学C语言程序设计竞赛(高级组) 三角平方数
题目描述 三角数:形如图a,圆点摆放成等边三角形的数字,则为三角数. (图a) 平方数:形如图b,小方块摆放成正方形的数字,则为平方数. (图b) 那么如果一个数字既是三角形数又是平方数,则称为三角平 ...
- Just Oj 2017C语言程序设计竞赛高级组A: 求近似值(矩阵快速幂)
A: 求近似值 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 求⌊(5–√+6–√)2n⌋⌊(5+6)2n⌋%9932017. 例如:n=1,(5–√+6–√)2( ...
- Just Oj 2017C语言程序设计竞赛高级组E: DATE ALIVE(二分匹配)
E: DATE ALIVE 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 五河士道家里的精灵越来越多了,而每一个精灵都想和他有一个约会.然而五河士道却只有一个,无奈 ...
- Just Oj 2017C语言程序设计竞赛高级组D: 字符串最大表示(next数组)
D: 字符串最大表示 时间限制: 1 s 内存限制: 128 MB 题目描述 有如下定义,abcnabcn表示字符串abc重复n次,例如abc2abc2表示abcabc. 给定一个字符串,求 ...
- 2018年江西理工大学C语言程序设计竞赛高级组部分题解
B Interesting paths 考察范围:组合数学 此题是机器人走方格的变种,n*m的网格,从(1,1)走到(n,m),首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条 ...
- 2014江西理工大学C语言程序设计竞赛高级组题解
1001 Beautiful Palindrome Number 枚举回文数字前半部分,然后判断该数字是否满足,复杂度为O(sqrt(n))! 1002 Recovery Sequence 本题的核 ...
- 2017年江西理工大学C语言程序设计竞赛(高级组)
问题 A: 求近似值 #include <stdio.h> #include <time.h> #include <stdlib.h> using namespac ...
随机推荐
- 2017-2018-2 20165221实验二《Java面向对象程序设计》实验报告
JAVA实验二报告 课程:Java程序设计 姓名:谭笑 学号:20165221 实验时间:2018.4.13--2018.4.15 实验2--1 实验内容 实现百分制成绩转成"优.良.中.及 ...
- Android 正则表达式验证手机号码
方案一:比较精准的判断手机段位,但是随着手机号段的增多要不断的修改正则 public boolean isPhoneNumber1(String phone) { String regExp = &q ...
- 使用jsencrypt(rsa加密方式)给js加密防被刷
加密步骤 1.需要加密的参数 * * ).toISOString().replace(/T/g, }Z/, ''); //使用本地时间,然后转换格式 2.js中引用jsencrypt.js文件,然后实 ...
- 使用thrift实现订阅服务和发布服务
使用thrift实现订阅服务和发布服务 服务:订阅服务 market_subscriber 和 发布服务 market_publisher功能:market_subscriber 能够向 market ...
- LNMP下Nginx 中文文件名或目录404无法访问的解决方法
貌似很多人还是会遇到中文乱码的问题,Apache可以使用mod_encoding支持中文目录和文件,LNMP下Nginx其实不需要安装额外的组件即可支持中文文件名或中文目录,下面说一下常见的CentO ...
- 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造
原文地址:http://blog.csdn.net/xiaowei_cqu/article/details/8067881 尺度空间理论 自然界中的物体随着观测尺度不同有不同的表现形态.例如我们形 ...
- struts2框架之重复提交问题
防止重复提交 1. 什么是重复提交 * 提交表单时,点击一次后,页面没有刷新时,马上又点击一次,就是重复提交 * 提交后,通过浏览器的回退,又回到了表单页面,再次提交 * 提交后,按F5刷新,也是重复 ...
- 基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用
基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用 HBase是一种分布式.面向列的NoSQL数据库,基于HDFS存储,以表的形式存储数据,表由行和列组成,列划分到列族中.HBase ...
- Python2018-字符串中字符个数统计
1 编写程序,完成以下要求: 统计字符串中,各个字符的个数 比如:"hello world" 字符串统计的结果为: h:1 e:1 l:3 o:2 d:1 r:1 w:1 prin ...
- LightOJ1004
#include<bits/stdc++.h> using namespace std; int Map[106][106]; int Vis[106][106]; int Num[106 ...