Java实现 蓝桥杯 历届试题 邮局
问题描述
C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流。为了方便村民们发信,C村打算在C村建设k个邮局,这样每户村民可以去离自己家最近的邮局发信。
现在给出了m个备选的邮局,请从中选出k个来,使得村民到自己家最近的邮局的距离和最小。其中两点之间的距离定义为两点之间的直线距离。
输入格式
输入的第一行包含三个整数n, m, k,分别表示村民的户数、备选的邮局数和要建的邮局数。
接下来n行,每行两个整数x, y,依次表示每户村民家的坐标。
接下来m行,每行包含两个整数x, y,依次表示每个备选邮局的坐标。
在输入中,村民和村民、村民和邮局、邮局和邮局的坐标可能相同,但你应把它们看成不同的村民或邮局。
输出格式
输出一行,包含k个整数,从小到大依次表示你选择的备选邮局编号。(备选邮局按输入顺序由1到m编号)
样例输入
5 4 2
0 0
2 0
3 1
3 3
1 1
0 1
1 0
2 1
3 2
样例输出
2 4
数据规模和约定
对于30%的数据,1<=n<=10,1<=m<=10,1<=k<=5;
对于60%的数据,1<=m<=20;
对于100%的数据,1<=n<=50,1<=m<=25,1<=k<=10。
import java.util.Scanner;
public class Main {
public static int n, m, k;
public static double[][] distance; //distanc[i][j]表示第i个村庄到第j个邮局的直线距离
public static int[] answer; //存放最终选中的k个邮局编号
public static double minSum; //表示选中k个邮局的最小距离和
public void init() {
distance = new double[n + 1][m + 1];
answer = new int[k + 1];
minSum = Double.MAX_VALUE;
}
/*
* 参数count:表示已经选中的邮局个数
* 参数current:表示DFS目前遍历到的邮局编号
* 参数minDis:minDis[i]表示村庄i到已选中邮局中的最短距离
* 参数tempAns:存放目前遍历过程中已经选中的邮局编号
*/
public void dfs(int count, int current, double[] minDis, int[] tempAns) {
if(count == k) { //当已经选中k个邮局时
double tempSum = 0;
for(int i = 1;i <= n;i++)
tempSum += minDis[i];
if(tempSum < minSum) {
minSum = tempSum;
for(int i = 1;i <= k;i++)
answer[i] = tempAns[i];
}
return;
} else if(k - count <= m - current && current <= m) { //表示在剩下未选中的邮局个数多于还需要选中的邮局个数
boolean judge = false; //用于判断当前选中的邮局current+1是否符合要求
double[] minDis1 = new double[n + 1]; //用于保存当前minDis数组中值
for(int i = 1;i <= n;i++)
minDis1[i] = minDis[i];
for(int i = 1;i <= n;i++) {
if(minDis[i] > distance[i][current + 1]) {
minDis[i] = distance[i][current + 1];
judge = true;
}
}
tempAns[count + 1] = current + 1;
if(judge == true) //邮局current + 1符合要求,选中个数加1继续搜索
dfs(count + 1, current + 1, minDis, tempAns);
dfs(count, current + 1, minDis1, tempAns); //直接舍弃邮局current+1,进行下一次搜索
}
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
k = in.nextInt();
test.init();
double[][] point = new double[n + 1][2]; //存放n个村庄的位置坐标
for(int i = 1;i <= n;i++) {
point[i][0] = in.nextDouble(); //村庄横坐标
point[i][1] = in.nextDouble(); //村庄纵坐标
}
for(int j = 1;j <= m;j++) {
double x = in.nextDouble(); //邮局横坐标
double y = in.nextDouble(); //邮局纵坐标
for(int i = 0;i <= n;i++) //计算1~n村庄到邮局j的直线距离
distance[i][j] = Math.sqrt((point[i][0]-x)*(point[i][0]-x) +
(point[i][1]-y)*(point[i][1]-y));
}
int[] tempAns = new int[k + 1];
double[] minDis = new double[n + 1]; //minDis[i]表示第i个村庄到已选中的邮局中的最小距离
for(int i = 1;i <= n;i++)
minDis[i] = Double.MAX_VALUE;//初始化第i个村庄到选中邮局中最小距离为最大值
test.dfs(0, 0, minDis, tempAns);
for(int i = 1;i <= k;i++)
System.out.print(answer[i]+" ");
}
}
Java实现 蓝桥杯 历届试题 邮局的更多相关文章
- Java实现蓝桥杯历届试题分考场
历届试题 分考场 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输 ...
- Java实现蓝桥杯历届试题兰顿蚂蚁
历届试题 兰顿蚂蚁 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其 ...
- Java实现蓝桥杯历届试题回文数字
历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...
- Java实现蓝桥杯历届试题高僧斗法
历届试题 高僧斗法 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以 ...
- Java实现蓝桥杯历届试题买不到的数目
历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友 ...
- Java实现 蓝桥杯 历届试题 斐波那契
试题 历届试题 斐波那契 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 - (x=1,2) f(x) = f(x-1) ...
- Java实现 蓝桥杯 历届试题 小计算器
历届试题 小计算器 时间限制:1.0s 内存限制:256.0MB 问题描述 模拟程序型计算器,依次输入指令,可能包含的指令有 1. 数字:'NUM X',X为一个只包含大写字母和数字的字符串,表示一个 ...
- Java实现蓝桥杯 历届试题 k倍区间
历届试题 k倍区间 时间限制:2.0s 内存限制:256.0MB 问题描述 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j) ...
- Java实现 蓝桥杯 历届试题 小数第n位
历届试题 小数第n位 时间限制:1.0s 内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的 ...
随机推荐
- A~Z;26个字母美式
26个字母美式读法 音频下载地址: 链接:https://pan.baidu.com/s/1KOlxNCydgtsODQZMT9JFJg 提取码:8a9g
- Puppeteer笔记(一):Puppeteer简介
一.Puppeteer简介 Puppeteer是NPM库,它提供了NodeJS高级API来控制Chrome.Puppeteer 默认以无头(无界面)方式运行,但也可以配置为运行有界面的Chrome. ...
- Spring + Struts + Hibernate + Bootstrap-table 实现分页和增删改查
1.bootstrap界面效果图: 2.Teacher实体类 public class Teacher { private int id; private String name; private S ...
- flask之路由route
''' app.py中的源码def route(self, rule, **options) @app.route()路由参数使用: 1.第一个位置参数为路由分发的请求路径 ①静态参数路由:/inde ...
- storm-jdbc详解
今天来说说Storm集成Jdbc是如何完成的,代码如下: 写入数据: 先来讲讲官方API: Map hikariConfigMap = Maps.newHashMap(); hikariConfigM ...
- slf4j、log4j、 logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着“拿来主义”的态度,复制粘贴下配置文件就开始编码了, ...
- 【Redis】Hash常见应用场景 - 电商购物车
电商购物车 以用户id为key 商品id为field 商品数量为value 购物车操作 [key(用户id),field(商品id),value(数量)] 添加商品 -> hset cart: ...
- Kubernetes as Database: 使用kubesql查询kubernetes资源
写在前面 kubectl虽然查询单个的kubernetes资源或者列表都已经比较方便,但是进行更为多个资源的联合查询(比如pod和node),以及查询结果的二次处理方面却是kubectl无法胜任的.所 ...
- 初识Mysql 外键
1.创建学生表(主表) CREATE TABLE `stu` ( `stunum` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT N ...
- linux静态网络设置
一:NET模式 第一种: 第二种方式: 三:重启服务