码迷,mamicode.com
首页 > 其他好文 > 详细

基站选址(编程之美2015资格赛)

时间:2015-04-18 12:46:02      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

时间限制: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

样例输入
2
3 3 4 1
1 2
2 1
2 3
3 2
2 2
4 4 4 2
1 2
2 4
3 1
4 3
1 4
1 3
样例输出
Case #1: 4
Case #2: 13
#include <iostream>
#include <limits.h>
#include <malloc.h>

using namespace std;

enum type{base,user};

typedef struct node
{
    int posx;
    int posy;
    type kind;
} node;

int findPostive(int data)
{
    if(data>=0)
        return data;
    else
        return -data;
}

int main()
{
    int num;
    cin>>num;
    int k = 0;
    while(k<num)
    {
        int n,m,a,b;
        cin>>n>>m>>a>>b;
        node *data = new node[a+b];

        for(int i = 0;i < a+b; i++)
        {
            cin>>data[i].posx>>data[i].posy;
            if(i<a)
                data[i].kind = user;
            else
                data[i].kind = base;
        }
        int min = INT_MAX;
        for(int i = 1;i <= n; i++)
            for(int j = 1;j <= m; j++)
            {
                int l;
                int cost = 0;
                for(l = 0;l < a; l++)
                    cost += ((i-data[l].posy)*(i-data[l].posy)+(j-data[l].posx)*(j-data[l].posx));

                int* dis = new int[b];

                for(l = a;l < a+b; l++)
                {
                    dis[l-a] = (findPostive(i-data[l].posy)+findPostive(j-data[l].posx));
                }

                int minvalue = INT_MAX;
                for(int h = 0; h < b; h++)
                    if(dis[h]<minvalue)
                        minvalue = dis[h];
                free(dis);
                cost += minvalue;
                //cout<<cost<<"  hello "<<endl;
                if(cost<min)
                min = cost;
            }
        cout<<"Case #"<<(k+1)<<": "<<min<<endl;
        k++;
        free(data);

    }
}

  

基站选址(编程之美2015资格赛)

标签:

原文地址:http://www.cnblogs.com/lxk2010012997/p/4437121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!