一 问题描述

设有 n 家客户,n<=31,每个客户有如下属性(客户名称、客户类型、经度、纬度、每月拜访次数)。

每个客户 times 天拜访 1 次。

每个客户每天最多拜访 8 次。

每月天数为 days。

求一个月拜访轨迹。

二 输入和输出

1 输入

第1行3个数用空行隔开:n times days 。

接下来的 n 行描述每个客户,每个客户信息包括(客户名称、客户类型、经度、纬度、每月拜访次数),客户类型有:B-商业拜访,H-医院拜访、P-药房拜访

2 输出

药代这个月每天拜访轨迹。

三 输入和输出样例

1 输入样例

31 3 31
H1 H 117.196067 39.103303 8
H2 H 117.206175 39.111509 8
H3 H 117.187551 39.109744 8
H4 H 117.179981 39.113295 8
H5 H 117.183536 39.125713 8
H6 H 117.209626 39.12228 8
H7 H 117.233087 39.082267 8
H8 H 117.195568 39.111846 8
H9 H 117.207421 39.121483 8
H10 H 117.191717 39.104914 8
H11 H 117.200753 39.109458 8
H12 H 117.182597 39.102957 8
H13 H 117.188228 39.128191 8
H14 H 117.193003 39.121008 8
H15 H 117.190858 39.135014 8
H16 H 117.179979 39.11038 8
M1 B 117.18461 39.117381 4
M2 B 117.206176 39.127932 4
M3 B 117.185073 39.124452 4
M4 B 117.183584 39.121472 4
M5 B 117.172522 39.126702 4
M6 B 117.185248 39.104909 4
M7 B 117.192618 39.129049 4
M8 B 117.181509 39.123574 4
P1 P 117.186092 39.130847 16
P2 P 117.212735 39.11644 16
P3 P 117.202735 39.11644 16
P4 P 117.206176 39.117932 16
P5 P 117.196367 39.103303 16
P6 P 117.209626 39.13228 16
P7 P 117.200653 39.109458 16

2 输出样例

1 号拜访客户:H7 > H1 > M6 > H16 > H4 > H13 > P1 > P4 >
2 号拜访客户:P5 > H11 > H2 > P2 > H14 > M4 > H5 > M7 >
3 号拜访客户:M2 > P6 > H6 > H9 > H15 > M8 > M5 > H3 >
4 号拜访客户:H10 > H1 > P7 > M6 > H4 > H13 > P1 > H7 >
5 号拜访客户:M7 > H5 > M4 > M1 > H8 > H11 > H2 > P5 >
6 号拜访客户:H12 > H3 > P3 > H9 > H6 > M2 > P6 > M5 >
7 号拜访客户:P1 > H13 > H4 > H16 > M6 > H1 > P7 > P4 >
8 号拜访客户:M7 > H5 > M1 > H14 > H8 > H2 > P2 > P5 >
9 号拜访客户:M8 > H15 > M2 > P6 > H6 > H9 > P3 > H3 >
10 号拜访客户:P7 > H1 > H10 > H16 > H4 > M3 > H13 > P4 >
11 号拜访客户:H8 > H11 > H2 > P2 > H14 > M1 > H5 > M7 >
12 号拜访客户:H3 > H12 > M5 > H15 > M2 > P6 > H6 > H9 >
13 号拜访客户:M3 > P1 > H4 > H10 > H1 > P7 > P4 > H7 >
14 号拜访客户:M4 > M1 > H14 > H5 > H8 > H11 > H2 > P2 >
15 号拜访客户:H15 > M8 > M5 > H3 > H12 > P3 > H6 > P6 >
16 号拜访客户:H4 > H16 > H10 > P7 > P4 > H13 > P1 > M3 >
17 号拜访客户:H8 > H11 > H2 > P2 > H14 > M4 > H5 > P5 >
18 号拜访客户:P3 > H9 > H6 > P6 > H15 > M8 > H3 > H12 >
19 号拜访客户:P7 > H1 > H10 > H16 > H4 > M3 > H13 > P1 >
20 号拜访客户:P5 > H11 > H8 > H2 > P2 > H14 > H5 >
21 号拜访客户:H15 > P6 > H6 > H9 > P3 > H3 > H12 >
22 号拜访客户:P7 > H1 > M6 > H16 > H4 > P1 > P4 > H7 >
23 号拜访客户:H14 > H5 > H8 > H11 > H2 > P2 > P5 >
24 号拜访客户:H9 > H6 > P3 > H3 > H12 > H15 > P6 >
25 号拜访客户:H16 > H10 > H1 > P7 > P4 > H13 > P1 > H7 >
26 号拜访客户:P5 > H11 > H8 > H14 > P2 >
27 号拜访客户:P6 > H9 > P3 > H12 > H15 >
28 号拜访客户:H13 > P1 > P4 > P7 > H10 > H16 > H7 >
29 号拜访客户:P2 > P5 >
30 号拜访客户:P6 > P3 > H12 >
31 号拜访客户:H10 > P7 > P4 > P1 > H7 >

四 代码

package com.platform.modules.alg.alglib.sdgt0001;import java.util.*;public class Sdgt0001 {public String output = "";/*** 默认地球半径*/private static double EARTH_RADIUS = 6371000; // 赤道半径(单位m)private final int inf = 0x3f3f3f3f;// 客户数private int n;// 拜访频率,几天拜访一次private int frequency;// 拜访天数,每月拜访多少天private int days;// 客户批次 map,第1个泛型代表第几批客户,第2个泛型代表批次客户列表private Map<Integer, List<Customer>> batchCustomerMap = new HashMap<>();// 拜访轨迹 map,第1个泛型代表每月第几天,第2个泛型代表该天拜访的客户列表private Map<Integer, List<Customer>> visitMap = new HashMap<>();// 轨迹计算public String cal(String input) {String[] line = input.split("\n");String[] params = line[0].split(" ");n = Integer.parseInt(params[0]); // 客户数frequency = Integer.parseInt(params[1]); // 几天拜访一次days = Integer.parseInt(params[2]); // 每月拜访多少天// 对输入数据进行处理for (int i = 1; i <= n; i++) {String[] customerStr = line[i].split(" ");Customer customer = new Customer();customer.setName(customerStr[0]); // 客户名称customer.setType(customerStr[1]); // 客户类别customer.setLocationLon(Double.parseDouble(customerStr[2])); // 经度customer.setLocationLat(Double.parseDouble(customerStr[3])); // 纬度customer.setTotalCount(Integer.parseInt(customerStr[4])); // 每月最多拜访次数// 批次客户列表加第1个客户,如果 frequency = 3,则批次下标范围 [0,1,2]if (batchCustomerMap.get(i % frequency) == null) {List<Customer> batchCustomerList = new ArrayList();batchCustomerList.add(customer);batchCustomerMap.put(i % frequency, batchCustomerList);} else { // 批次客户列表加其他客户batchCustomerMap.get((i % frequency)).add(customer);}}// 每日拜访处理for (int i = 1; i <= days; i++) {// 批次下标号,处理第几批客户int batch = i % frequency;// 获取某批次客户列表List<Customer> customers = batchCustomerMap.get(batch);// 打乱批次客户列表顺序Collections.shuffle(customers);List<Customer> selectCustomers = new ArrayList<>();// 选择前8个客户for (int j = 0; j < customers.size(); j++) {if (customers.get(j).getTotalCount() > 0) {selectCustomers.add(customers.get(j));if (selectCustomers.size() >= 8) {break;}}}// 每日拜访的第1个客户if (selectCustomers.size() == 0) continue;Customer startCustomer = selectCustomers.get(0);// 标识该客户已访问startCustomer.setVisited(true);// 修正剩余可拜访次数int plusCount = startCustomer.getTotalCount() - 1;startCustomer.setTotalCount(plusCount);// 创建第 i 号的拜访客户列表List<Customer> oneDayCustomerList = new ArrayList();visitMap.put(i, oneDayCustomerList);// 向 i 号拜访客户列表加第1个客户oneDayCustomerList.add(startCustomer);Customer firstCustomer; // 两次相邻拜访的前一个客户Customer secondCustomer; // 两次相邻拜访的后一个客户Customer nextSelectCustomer = new Customer(); // 下一个选中的客户double tempMinDistance; // 临时最短距离firstCustomer = startCustomer;for (int m = 1; m < selectCustomers.size(); m++) { // 从第2个客户开始处理double minDistance = inf; // 初始化最短距离for (int n = 1; n < selectCustomers.size(); n++) { // 从第2个客户开始处理secondCustomer = selectCustomers.get(n);// 两次相邻拜访的后一个客户如果已经拜访或剩余可拜访次数为0,不处理if (secondCustomer.isVisited() || secondCustomer.getTotalCount() == 0) {continue;}// 计算相邻两个客户的距离tempMinDistance = GetDistance(firstCustomer.getLocationLon(), firstCustomer.getLocationLat(), secondCustomer.getLocationLon(), secondCustomer.getLocationLat());if (tempMinDistance < minDistance) {// 更新最短距离minDistance = tempMinDistance;// 最短距离对应的客户nextSelectCustomer = secondCustomer;}}// 下一个被选中的客户设置为已拜访nextSelectCustomer.setVisited(true);int plusTimes = nextSelectCustomer.getTotalCount() - 1;// 下一个被选中的客户剩余拜访次数nextSelectCustomer.setTotalCount(plusTimes);// 向 i 号拜访客户列表加选中的客户visitMap.get(i).add(nextSelectCustomer);firstCustomer = nextSelectCustomer;}// visited 只对当天拜访起作用,所以要清空 visited 标识for (Customer selectCustomer : customers) {selectCustomer.setVisited(false);}}// 输出处理for (int i = 1; i <= days; i++) {List<Customer> customers = visitMap.get(i);if (customers == null) {continue;}output += i + " 号拜访客户:";for (Customer customer : customers) {output += customer.getName() + " > ";}output += "\n";}return output;}/*** 功能描述:通过经纬度计算两点之间的距离** @param lon1 第 1 个点的经度* @param lat1 第 1 个点的纬度* @param lon2 第 2 个点经度* @param lat2 第 2 个点纬度* @return 两点间的距离* @author chengqiuming* @date 2022/10/25* @description:*/public double GetDistance(double lon1, double lat1, double lon2, double lat2) {double radLat1 = rad(lat1);double radLat2 = rad(lat2);double a = radLat1 - radLat2;double b = rad(lon1) - rad(lon2);double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000) / 10000;return s;}/*** 转化为弧度(rad)*/private static double rad(double d) {return d * Math.PI / 180.0;}
}class Customer {// 客户名称private String name;// 客户类型 H-医院客户 M-商业公司客户 P-药房拜访private String type;// 经度private Double locationLon;// 纬度private Double locationLat;// 每月最多可拜访次数private int totalCount;// 是否已拜访private boolean visited = false;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public Double getLocationLon() {return locationLon;}public void setLocationLon(Double locationLon) {this.locationLon = locationLon;}public Double getLocationLat() {return locationLat;}public void setLocationLat(Double locationLat) {this.locationLat = locationLat;}public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {this.totalCount = totalCount;}public boolean isVisited() {return visited;}public void setVisited(boolean visited) {this.visited = visited;}
}

五 测试

1 输入

31 3 31

H1 H 117.196067 39.103303 8

H2 H 117.206175 39.111509 8

H3 H 117.187551 39.109744 8

H4 H 117.179981 39.113295 8

H5 H 117.183536 39.125713 8

H6 H 117.209626 39.12228 8

H7 H 117.233087 39.082267 8

H8 H 117.195568 39.111846 8

H9 H 117.207421 39.121483 8

H10 H 117.191717 39.104914 8

H11 H 117.200753 39.109458 8

H12 H 117.182597 39.102957 8

H13 H 117.188228 39.128191 8

H14 H 117.193003 39.121008 8

H15 H 117.190858 39.135014 8

H16 H 117.179979 39.11038 8

M1 B 117.18461 39.117381 4

M2 B 117.206176 39.127932 4

M3 B 117.185073 39.124452 4

M4 B 117.183584 39.121472 4

M5 B 117.172522 39.126702 4

M6 B 117.185248 39.104909 4

M7 B 117.192618 39.129049 4

M8 B 117.181509 39.123574 4

P1 P 117.186092 39.130847 10

P2 P 117.212735 39.11644 10

P3 P 117.202735 39.11644 10

P4 P 117.206176 39.117932 10

P5 P 117.196367 39.103303 10

P6 P 117.209626 39.13228 10

P7 P 117.200653 39.109458 10

2 输出

1 号拜访客户:P4 > P7 > H10 > H16 > H4 > M3 > H13 > H7 >

2 号拜访客户:H5 > M7 > H14 > M1 > H8 > H11 > H2 > P2 >

3 号拜访客户:M2 > P6 > H6 > H9 > P3 > H3 > M8 > H15 >

4 号拜访客户:P7 > H1 > H10 > M6 > H4 > H13 > P1 > H7 >

5 号拜访客户:P2 > H2 > H11 > P5 > M1 > M4 > H14 > M7 >

6 号拜访客户:H6 > M2 > P6 > P3 > H3 > H12 > M8 > M5 >

7 号拜访客户:P4 > P7 > H10 > M6 > H16 > H4 > P1 > H7 >

8 号拜访客户:P5 > H8 > H2 > P2 > M7 > H5 > M4 > M1 >

9 号拜访客户:M5 > M8 > H3 > P3 > H9 > H6 > M2 > P6 >

10 号拜访客户:P1 > H13 > M3 > H4 > H16 > H10 > P7 > H7 >

11 号拜访客户:M4 > M1 > H14 > M7 > H5 > H11 > P5 > P2 >

12 号拜访客户:H15 > M8 > M5 > H12 > P3 > H9 > M2 > P6 >

13 号拜访客户:H4 > M6 > H10 > H1 > P7 > M3 > H13 > P1 >

14 号拜访客户:P5 > H11 > H2 > P2 > H8 > H14 > M4 > H5 >

15 号拜访客户:P3 > H9 > H6 > P6 > H15 > M5 > H3 > H12 >

16 号拜访客户:M6 > H16 > H4 > M3 > H13 > P4 > H1 > H7 >

17 号拜访客户:H14 > H5 > H8 > H11 > H2 > P2 > P5 >

18 号拜访客户:P6 > H6 > H9 > P3 > H3 > H12 > H15 >

19 号拜访客户:P1 > H13 > H4 > H10 > H1 > P7 > P4 > H7 >

20 号拜访客户:P2 > H2 > H11 > H8 > P5 > H14 > H5 >

21 号拜访客户:P6 > H6 > H9 > P3 > H3 > H12 > H15 >

22 号拜访客户:H10 > H1 > P7 > H16 > H4 > H13 > P1 > H7 >

23 号拜访客户:H5 > H14 > H8 > H11 > H2 > P2 > P5 >

24 号拜访客户:P3 > H9 > H6 > P6 > H15 > H3 > H12 >

25 号拜访客户:P7 > H1 > H10 > H16 > H13 > P1 > P4 > H7 >

26 号拜访客户:H8 > H11 > H2 > P2 > H14 > H5 > P5 >

27 号拜访客户:H3 > H12 > P3 > H9 > H6 > P6 > H15 >

28 号拜访客户:P4 > P7 > H1 > H16 > P1 >

29 号拜访客户:H8 > P5 > P2 >

30 号拜访客户:H12 > P3 > P6 > H15 >

31 号拜访客户:P1 > P4 > P7 > H1 > H16 >

基于经纬度的拜访轨迹问题相关推荐

  1. 基于经纬度和工作日的拜访轨迹问题

    一 问题描述 设有 n 家客户,n <= 24,每个客户有如下属性(客户名称.客户类型.经度.纬度.每月拜访次数). 每个客户 m 天拜访 1 次. 每个客户每天最多拜访 8 次. 给出一个月的 ...

  2. android 基于高德地图的轨迹回放

    android 基于高德地图的轨迹回放 前段时间公司项目有一个需求,就是需要看到设备上传之后的轨迹路线,并且可以实现回放的整个过程,功能包括路线回放.地图位置插点.回放之后的轨迹标记颜色.回放加速等功 ...

  3. 基于MPC的移动机器人轨迹跟踪控制qpOASES例程

    参考了 一个模型预测控制(MPC)的简单实现 https://www.cnblogs.com/zhjblogs/p/13880682.html 与 基于MPC的移动机器人轨迹跟踪控制matlab例程 ...

  4. ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试

    ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试 gazebo仿真测试 gazebo仿真测试 启动gazebo并加载无人机模型 $ roslaun ...

  5. 基于运动学模型的轨迹跟踪控制

    章四 基于运动学模型的轨迹跟踪控制 MPC(4)基于运动学模型的轨迹跟踪控制器设计 无人驾驶车辆模型预测控制(龚建伟)第四章 基于运动学模型的轨迹跟踪控制(仿真部分) 无人车辆在惯性坐标系中,车辆必须 ...

  6. spark如何进行聚类可视化_基于Spark的出租车轨迹处理与可视化平台

    由于城市化进程加剧以及汽车数量增加, 城市交通问题日益严重[, 通过分析各种空间数据解决交通问题是当前研究的热点. 出租车提供广泛且灵活的交通运输服务, 是城市交通的重要组成部分. 出租车轨迹数据记录 ...

  7. mysql数据范围什么意思_数据都在mysql里的话,基于经纬度的范围查询有什么高效的方案吗...

    [今日话题] 数据都在mysql里的话,基于经纬度的范围查询有什么高效的方案吗 – yingang 1. 经纬度搜索(1)-Geohash算法原理 http://hankesi2000.iteye.c ...

  8. 基于遥感影像及轨迹数据融合的地图自动化生成器

    自动化的地图生成对于城市服务及基于位置服务非常重要,现有的工作研究主要利用遥感影像或可以充分反映地图路网情况的车辆轨迹数据生成地图,数据源较为单一,如果能将遥感影像数据及轨迹数据融合起来,地图生成的质 ...

  9. [运动规划算法]基于飞行走廊的轨迹优化

    文章目录 简介 一.介绍 二.原理 飞行走廊生成 三.项目演示 参考 简介 Btraj是一个在线的四旋翼无人机的运动规划框架,主要用于未知环境中的自主导航.基于机载状态估计和环境感知,采用基于快速行进 ...

最新文章

  1. python本地文件上传到网页_如何将文件上传到pythonweb服务器?
  2. ssh服务常见问题及其解决办法
  3. [转]MySQL Explain详解
  4. 架构评审方法和思路总结
  5. 深度学习概述:从感知机到深度网络
  6. 用python恢复删除的文件_使用python删除N天前的文件
  7. 【Java】Volitile的作用、JVM规范如何要求内存屏障、硬件层级内存屏障如何帮助java实现高并发 - 第二天笔记
  8. mysql获取多张表中的数据_mysql 之多表查询
  9. Permutation Partitions CodeForces - 1326C(组合数学+思维)
  10. rtsp实时流通过rtmp推送到服务端
  11. 看我如何发现(并修复)Python 源代码中的漏洞
  12. Mac系统如何删除.DS_Store文件且不再生
  13. SharePoint Foundation 2013安装-1:先决条件准备
  14. Unity性能优化专题---腾讯牛人分享经验
  15. 结构梁配筋最牛插件_结构设计最让人困惑的问题解析汇总
  16. 简单计算器代码(含加减乘除取余5个操作)
  17. 为什么SSD目标检测算法对小目标检测的效果不好
  18. Java 最佳学习途径
  19. Spring的Orderd接口以及@Order、@Primary、@Priority三个注解介绍
  20. 有没有一两万的创业项目

热门文章

  1. SQL 两表关联删除其中一张表数据
  2. 【.net】Ueditor中图片上传和图片回显路径的设置
  3. 【AIOps下的探索与实践】神州灵云和Rancher共同举办Container Open Talk 沙龙活动
  4. 【数论】质数筛选法(埃拉托色尼筛法及线性筛法)
  5. 《高效能人士的7个习惯》读书笔记PPT模板
  6. 修改图片上的文字步骤
  7. 基于CNN的手写数字识别
  8. Java 面试总结之二
  9. 【机器学习】条件随机场CRF算法 梳理
  10. win11安装pytorch-gpu遇到的坑