博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2015编程之美(资格赛)--基站选址
阅读量:6315 次
发布时间:2019-06-22

本文共 2288 字,大约阅读时间需要 7 分钟。

题目3 : 基站选址

时间限制:2000ms
单点时限:1000ms
内存限制:256MB

描述

需要在一个N × M的网格中建立一个通讯基站,通讯基站仅必须建立在格点上。

网格中有A个用户,每个用户的通讯代价是用户到基站欧几里得距离的平方。

网格中还有B个通讯公司,维护基站的代价是基站到最近的一个通讯公司的路程(路程定义为曼哈顿距离)。

在网格中建立基站的总代价是用户通讯代价的总和加上维护基站的代价,最小总代价。

输入

第一行为一个整数T,表示数据组数。

每组数据第一行为四个整数:N, M, A, B。

接下来的A+B行每行两个整数x, y,代表一个坐标,前A行表示各用户的坐标,后B行表示各通讯公司的坐标。

输出

对于每组数据输出一行"Case #X: Y",X代表数据编号(从1开始),Y代表所求最小代价。

数据范围

1 ≤ T ≤ 20

1 ≤ x ≤ N

1 ≤ y ≤ M

1 ≤ B ≤ 100

小数据

1 ≤ N, M ≤ 100

1 ≤ A ≤ 100

大数据

1 ≤ N, M ≤ 107

1 ≤ A ≤ 1000

样例输入
23 3 4 11 22 12 33 22 24 4 4 21 22 43 14 31 41 3
样例输出
Case #1: 4Case #2: 13     这道题,很不好理解:  刚开始代码思路错了n边.....
4 4 4 21 22 43 14 31 41 3  可以排除基站的坐标为(2,,3) 所以得到的数据欧几里得的距离为{x1*x1+y1*y1); 对于路程为: 直接坐标之差的绝对值(x+y); 代码:
1 #define _CRT_SECURE_NO_WARNINGS 2  3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 using namespace std;12 const int inf = 0x3f3f3f3f;13 struct point {14 int x, y;15 16 };17 18 void input(point &max_p, point & min_p, vector
& aa, const int num) {19 20 point tem = { 0,0 };21 for (int i = 0; i < num; i++) {22 scanf("%d %d", &tem.x, &tem.y);23 max_p.x = max(max_p.x, tem.x);24 min_p.x = min(min_p.x, tem.x);25 max_p.y = max(max_p.y, tem.y);26 min_p.y = min(min_p.y, tem.y);27 aa.push_back(tem);28 }29 }30 31 //求距离的平方32 int dist(const point &aa, const point &bb) {33 34 int x = aa.x - bb.x;35 int y = aa.y - bb.y;36 return x*x + y*y;37 }38 39 //求距离40 int dist_sqrt(const point &aa, const point &bb) {41 42 int x = abs(aa.x - bb.x);43 int y = abs(aa.y - bb.y);44 return x+y;45 }46 47 int work(const point &max_p, const point & min_p, const vector
& aa, const vector
& bb) {48 49 int x, y;50 int res = inf, temp = 0,ttu=inf;51 for (x = min_p.x; x <= max_p.x; x++) {52 for (y = min_p.y; y <= max_p.y; y++) {53 temp = 0;54 point tt = { x,y };55 for (int i = 0; i
aa, bb;74 scanf("%d", &_case);75 for (cnt = 1; cnt <= _case; cnt++) {76 77 point max_p = { 0,0 }, min_p = { inf,inf };78 aa.clear(),bb.clear();79 scanf("%d %d %d %d", &nn, &mm, &AA, &BB);80 input(max_p, min_p, aa, AA);81 input(max_p, min_p, bb, BB);82 int res = work(max_p, min_p, aa, bb);83 84 printf("Case #%d: %d\n", cnt, res);85 }86 //cin.get();87 return 0;88 }

转载地址:http://dxkaa.baihongyu.com/

你可能感兴趣的文章
参与博客编辑器改版,我的礼物 感谢51cto
查看>>
JavaWeb笔记——JSTL标签
查看>>
一些实用性的总结与纠正
查看>>
Kubernetes概念
查看>>
一个小代码,欢迎大佬的意见,求指正
查看>>
Spring.Net+WCF实现分布式事务
查看>>
swoole异步任务task处理慢请求简单实例
查看>>
oracle数据泵导入分区表统计信息报错(四)
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
细说多线程(五) —— CLR线程池的I/O线程
查看>>
JavaScript instanceof和typeof的区别
查看>>
Hadoop文件系统详解-----(一)
查看>>
状态码
查看>>
我的友情链接
查看>>
多年一直想完善的自由行政审批流程组件【2002年PHP,2008年.NET,2010年完善数据设计、代码实现】...
查看>>
自动生成四则运算题目
查看>>
数据库设计中的14个技巧
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>
git回退到某个历史版本
查看>>
ecshop
查看>>