给我们n个坐标点和一个距离d,表示车开m米就没油了。

然后要选几个点建立油站,使得能够从1出发遍历所有的点,然后回到1。  并且规定1这个点必须有油站,在第i个点建立油站的费用是 2^(i-1)

因为费用的特殊性质,如果最大的点能够不建立,那么肯定是不建的。 所以首先在所有的点建立油站,看是否可以遍历所有的点,然后依次从大到小枚举点,看是否可以不建立油站。

但是卡在如何判断是否能够遍历所有的点上。

首先判断,所有的油站距离最近的油站的距离不能超过d,  如果超过就不能到达,而且也不能通过没有油站的点中转

然后,不是油站的点距离最近的油站的距离不能超过d/2 ,这个很显然,如果超过d/2,那么从油站到达这个点,就没办法回去了。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <stack>
  7. #include <math.h>
  8. using namespace std;
  9. /*
  10. 花费是2^(i-1) 这个很特殊
  11. 如何高效得判断是否能经过所有的点然后回家?
  12. */
  13. const int INF = <<;
  14. const int N = + ;
  15. struct Point
  16. {
  17. int x,y;
  18. double dist(const Point &rhs)
  19. {
  20. return sqrt( (x-rhs.x)*(x-rhs.x)+(y-rhs.y)*(y-rhs.y) );
  21. }
  22. }a[N];
  23. int n,d;
  24. int dist[N][N];
  25. int sta[N];
  26. bool vis[N];
  27. int cnt1,cnt2;
  28. bool bfs()
  29. {
  30. memset(vis,,sizeof(vis));
  31. int tmp = ;
  32. for(int i=;i<=n;++i)
  33. tmp += sta[i];
  34. cnt1 = ;
  35. cnt2 = ;
  36. vis[] = true;
  37. queue<int> q;
  38. q.push();
  39. while(!q.empty())
  40. {
  41. int u = q.front();q.pop();
  42. for(int i=;i<=n;++i)
  43. {
  44. if(!sta[i]) continue;
  45. if(!vis[i] && dist[u][i]<=d)
  46. {
  47. q.push(i);
  48. cnt1++;
  49. vis[i] = true;
  50. }
  51. }
  52. }
  53. for(int i=;i<=n;++i)
  54. if(sta[i]) q.push(i);
  55. while(!q.empty())
  56. {
  57. int u = q.front(); q.pop();
  58. for(int i=;i<=n;++i)
  59. {
  60. if(sta[i]) continue;
  61. if(!vis[i] && dist[u][i]*<=d)
  62. {
  63. vis[i] = true;
  64. cnt2++;
  65. }
  66. }
  67. }
  68. if(cnt1==tmp && cnt2==n-tmp) return true;
  69.  
  70. return false;
  71. }
  72. int main()
  73. {
  74. //freopen("d:/in.txt","r",stdin);
  75. while(scanf("%d%d",&n,&d)!=EOF)
  76. {
  77. for(int i=;i<=n;++i)
  78. {
  79. scanf("%d%d",&a[i].x,&a[i].y);
  80. sta[i] = true;
  81. }
  82. for(int i=;i<=n;++i)
  83. {
  84. for(int j=;j<=n;++j)
  85. dist[i][j] = dist[j][i] = (int)ceil(a[i].dist(a[j]));
  86. }
  87. if(bfs())
  88. {
  89.  
  90. for(int i=n;i>=;--i)
  91. {
  92. sta[i] = false;
  93. if(!bfs())
  94. sta[i] = true;
  95. }
  96. while(sta[n]==) n--;
  97. for(int i=n;i>=;--i)
  98. printf("%d",sta[i]);
  99. puts("");
  100. }
  101. else
  102. puts("-1");
  103. }
  104. return ;
  105. }

2012天津E题的更多相关文章

  1. 2012天津C题

    行李箱上的密码锁大家都知道, 现在给我们长度为n(n<=1000)的两个密码串,每次可以转动连续的1->3个字符1格,问最少多少次可以使得第一个串变成第二个串 经历了搜索,贪心,的思路后, ...

  2. MT【259】2016天津压轴题之最佳逼近

    (2016天津压轴题)设函数$f(x)=(x-1)^3-ax-b,x\in R$, 其中$a,b\in R$(1)求$f(x)$的单调区间.(2)若$f(x)$存在极值点$x_0$,且$f(x_1)= ...

  3. HDU 4279 Number(2012天津网络游戏---数论分析题)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:pid=4279">http://acm.hdu.edu ...

  4. USACO翻译:USACO 2012 JAN三题(2)

    USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...

  5. USACO翻译:USACO 2012 JAN三题(1)

    USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...

  6. 【2012天津区域赛】部分题解 hdu4431—4441

    1001: 题意:给你13张麻将牌,问可以胡哪些张 思路: 枚举可能接到的牌,然后dfs判断能否胡 1002: 题意: 已知n,m 求 n的所有约数在m进制下的平方和 做法:队长用java高精度写的 ...

  7. HDU 4423 Simple Function(数学题,2012长春D题)

    Simple Function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. USACO翻译:USACO 2012 JAN三题(3)

    USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...

  9. hdu 4278 2012天津赛区网络赛 数学 *

    8进制转为10进制 #include<cstdio> #include<iostream> #include<algorithm> #include<cstr ...

随机推荐

  1. SAP自带的创建报表工具

    SAP自带的工具有quickview和query两个主要的工具,当然还有其他的 quickview和query的区别主要是query支持系统之间的传输,quickview只能是用户的客户端创建使用,不 ...

  2. javacsript (十一) 对象

    他的对象的概念和python的字典的格式一样, JavaScript 对象 对象由花括号分隔.在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义.属性由逗号分隔: var ...

  3. form表单提交不成功提示

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  4. 9月mob(ShareSDK)活动预告,这个秋天非常热

    9月秋天来临,广州的天气依旧非常热,广州的活动氛围更热~ 先有GMGC B2B对接会在广州创新谷,再有上方网TFC全球移动游戏开发人员大会来袭,游戏圈的火越烧越旺,成都GMGDC全球移动游戏开发人员大 ...

  5. NoSql 数据库

    几款主流 NoSql 数据库的对比 posted @ 2016-05-11 21:36 vajoy 阅读(915) 评论(3) 编辑 收藏   最近小组准备启动一个 node 开源项目,从前端亲和力. ...

  6. [Android学习笔记]EditText的使用

    EditText就是我们最常用的文本输入框 常用属性见官方文档 主要是以下几个问题: 1.取消默认获取焦点 Activity启动时候会把焦点默认停留在第一个EditText控件上 一般的解决方法是在此 ...

  7. 3.1.2 MVC模式和URL访问

    本节课大纲: 一.什么是MVC //了解 M -Model 编写model类 对数据进行操作 使用Model类 来操作数据 V -View 编写html文件,页面呈现 C -Controller 编写 ...

  8. Java+7入门经典 - 6 扩展类与继承 Part 2/2

    6.12 设计类 1) 通过已定义的基类派生子类, 并且添加方法和数据成员来自定义子类, 创建出类的层次结构; Dog 'IS-A' Animal 2) 定义一系列没有层次结构, 由类对象作为数据成员 ...

  9. 关于NSArray的几种排序:

    #利用数组的sortedArrayUsingComparator调用 NSComparator  当中NSComparator事实上就是一个返回NSComparisonResult的block. ty ...

  10. 以JTextPanel为例Swing的鼠标事件详解

    如下界面可以通过该界面研究一下Swing的鼠标事件: 图中用红粗线圈起来的为JtextPanel,该Panel添加了鼠标事件监听器,鼠标事件监听器有三种,分别为MouseWheelListener,M ...