1730: 通信基站

Time Limit: 1 Sec  Memory Limit:
128 MB

Submit: 28  Solved: 11



SubmitStatusWeb
Board

Description

Input

Output

Sample Input

2
2 1 1
0 0
4 4
3 100 1
0 0
1 1
500 500

Sample Output

2.00
201.41

原题链接
这次真是学到了,看得大神的代码,思路真是不错,最也就八个点,每个点有建与不建两种状态,所以最都也就是2^8种情况,我们每次列举有多少个地点建基站,然后就进行全排列,直到所有的全排列都列举一遍,prev_permutation(s+1,s+n+1)记录所有的全排列,然后再进行搜索,dfs查找出当前方案下最小的花费,搜索的时候要进行回溯

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int a[100],b[100];
int ta,tb;
double x[11],y[11];
double used[100],sum;
double Cr,Cs;
int n,s[100];
double dis(int a,int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
void dfs(int pos)//pos记录已经覆盖的没有基站的数量
{
if(pos==ta+1)
{
double res=0;
for(int i=1;i<=n;i++)
res+=used[i];
sum=min(res,sum);//sum表示当前方案下最小的距离
return ;
}
for(int j=1;j<=tb;j++)
{
double d=dis(b[j],a[pos]);
double val=used[j];
used[j]=max(used[j],d);//要用max,因为必须多个点全部覆盖
dfs(pos+1);
used[j]=val;//这个点可以不进行扩张
}
}
double solve(int cnt)
{
double res=Cs*cnt;
ta=tb=0;
for(int i=1;i<=n;i++)
{
if(s[i]) b[++tb]=i;
else a[++ta]=i;
used[i]=0;
}
sum=0;
if(cnt!=n)
sum=INF;//如果每个点都建立基站,sum就无意义
dfs(1);//共有ta个点没有基站,所以其他基站要进行覆盖
return res+sum*Cr;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%lf%lf",&n,&Cs,&Cr);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
double ans=INF;
for(int i=1;i<=n;i++)
{
memset(s,0,sizeof(s));
for(int j=1;j<=i;j++)
s[j]=1;
do
{
ans=min(ans,solve(i));
}while(prev_permutation(s+1,s+n+1));//判断是否已经完成所有的全排列
}
printf("%.2f\n",ans);
}
return 0;
}

最新文章

  1. Graph | Eulerian path
  2. hdu 4033Regular Polygon(二分+余弦定理)
  3. VS2008 调试记录
  4. 淮安团购网美团联盟网赚版 v5.7
  5. Event-based Asynchronous Pattern Overview基于事件的异步模式概览
  6. python运算符使用规律
  7. Objective-C中math.h数学计算公式介绍
  8. Service介绍(MediaPlayer应用)
  9. zepto.js介绍
  10. Chef 自动化运维:开始“烹饪”
  11. myeclipse 扩展内存大小
  12. TCP三次握手及其背后的缺陷
  13. 【Spark篇】---SparkSQL中自定义UDF和UDAF,开窗函数的应用
  14. python对mysql进行简单操作
  15. linux 环境变量 转
  16. invalidate和requestLayout
  17. JMeter 参数化之利用JDBCConnectionConfiguration从数据库读取数据并关联变量
  18. mysql字符串 转 int-double CAST与CONVERT 函数的用法
  19. Nginx安装与使用 及在redhat 中的简单安装方式
  20. linux 打压缩包

热门文章

  1. CentOS 7 使用 yum 安装 MariaDB 与 MariaDB 的简单配置
  2. C# 调用指定打印机 (并不是默认)
  3. node.js(API解读) - process (http://snoopyxdy.blog.163.com/blog/static/60117440201192841649337/)
  4. charAt 写一个反序函数
  5. 啥是SQL?
  6. Flask - Flask的蓝图(BluePrint)
  7. 内存管理(malloc和free的用法)
  8. Ubuntu 安装有道词典
  9. log4net的相关使用笔记
  10. 火星人 2004年NOIP全国联赛普及组