当前位置: 首页 > news >正文

HDU 3920 Clear All of Them I(DP + 状态压缩 + 贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3920

题目大意:你在一个位置用激光枪灭敌人,给你初始位置,下面是2*n个敌人的位置,你一枪能杀两个,可以杀死任意两个人,激光束的路径是消耗的能量,求最小能量,保证一次只消灭两个敌人,你的位置不变

Sample Input
2
 
 
0 0
1
6 0
3 0
 
 
0 0
2
1 0
2 1
-1 0
-2 0
 
Sample Output
Case #1: 6.00
Case #2: 4.41

分析:给每个点编个号,用状态压缩表示射击那些点,射击过的表示为1,dp[i]表示射击状态 i 时最少消耗,答案即为dp[(1<<2*n)-1]

  先每个点到射击点排个序,每次选最近的一个点,和距离这个点最近的点,这两个就是应该选的点(贪心)

代码如下:

 1 # include<cstdio>
 2 # include<cstring>
 3 # include<algorithm>
 4 # include<iostream>
 5 # include<cmath>
 6 using namespace std;
 7 const int INF = 0xffffff;
 8 double dis[21][21],dp[1<<21];
 9 int vis[1<<21];
10 int n,fx,fy;
11 struct NODE
12 {
13     int x,y;
14 } node[21];
15 double DIS(double x1,double y1,double x2,double y2)
16 {
17     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
18 }
19 bool cmp(NODE a,NODE b)
20 {
21     return DIS(a.x,a.y,fx,fy)<DIS(b.x,b.y,fx,fy);
22 }
23 double DP(int sta)
24 {
25     if(vis[sta])
26         return dp[sta];
27     vis[sta] = 1;
28     if(sta==0)
29         dp[0]=0.0;
30     else
31     {
32         int i;
33         for(i=0; i<2*n; i++)
34         {
35             if((1<<i) & sta)break;
36         }
37         for(int j=i+1; j<2*n; j++)
38         {
39             if((sta & (1<<j))==0)continue;
40             dp[sta]=min(DP(sta^(1<<j)^(1<<i))+dis[i][j],dp[sta]);
41         }
42     }
43     return dp[sta];
44 }
45 int main()
46 {
47     int T,cas=1;
48     int i,j;
49     scanf("%d",&T);
50     for(cas=1; cas<=T; cas++)
51     {
52         scanf("%d%d",&fx,&fy);
53         scanf("%d",&n);
54         for(i=0; i<2*n; i++)
55             scanf("%d%d",&node[i].x,&node[i].y);
56         sort(node,node+2*n,cmp);
57         for(i=0; i<2*n; i++)
58             for(j=i+1; j<2*n; j++)
59             {
60                 dis[i][j]=DIS(node[i].x,node[i].y,fx,fy)+DIS(node[i].x*1.0,node[i].y*1.0,node[j].x*1.0,node[j].y*1.0);
61             }
62         memset(vis,0,sizeof(vis));
63         memset(dp,INF,sizeof(dp));
64         printf("Case #%d: %.2f\n",cas,DP((1<<(2*n))-1));
65     }
66     return 0;
67 }

 

相关文章:

  • 美化代码的15个代码语法高亮工具
  • 异常的概念和Java异常体系结构
  • 解决ftp不支持软连接
  • Entity Framework做IN查询
  • cocos2d-x 向android移植问题汇总
  • http Post 请求一网络资源返回字符串
  • GOOGLE PROTOBUF开发者指南
  • 对编程的一些思考
  • Android项目 手机安全卫士(代码最全,注释最详细)之七 应用程序的更新安装...
  • UNIX网络编程---简介
  • 2013-09-18 开始写博客
  • Redis配置文件参数说明
  • HDU 1297 Children’s Queue
  • C++Primer笔记之复制控制
  • Sublime text 2在windows上搭建C/C++环境
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Bytom交易说明(账户管理模式)
  • C++入门教程(10):for 语句
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript创建对象的四种方式
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Redis 懒删除(lazy free)简史
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 力扣(LeetCode)56
  • 设计模式(12)迭代器模式(讲解+应用)
  • 深入浅出Node.js
  • 微信小程序填坑清单
  • 小试R空间处理新库sf
  • k8s使用glusterfs实现动态持久化存储
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​批处理文件中的errorlevel用法
  • ​学习一下,什么是预包装食品?​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #NOIP 2014#Day.2 T3 解方程
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (1)常见O(n^2)排序算法解析
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C++20) consteval立即函数
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (一)u-boot-nand.bin的下载
  • (转) Face-Resources
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net CHARTING图表控件下载地址
  • .NET Standard 的管理策略
  • .NetCore项目nginx发布
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET连接MongoDB数据库实例教程
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET中 MVC 工厂模式浅析