题意:二维平面有一堆点,每个点有价值v和删掉这个点能得到的长度l,问你删掉最少的价值能把剩余点围起来,价值一样求删掉的点最少

思路:n<=15,那么直接遍历2^15,判断每种情况。这里要优化一下,如果价值比当前最优大了continue。POJ的G++输出要用%f...orz,还是乖乖用C++...

代码:

  1. #include<set>
  2. #include<map>
  3. #include<stack>
  4. #include<cmath>
  5. #include<queue>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<sstream>
  11. #include<iostream>
  12. #include<algorithm>
  13. typedef long long ll;
  14. using namespace std;
  15. const int maxn = + ;
  16. const int MOD = 1e9 + ;
  17. const int INF = 0x3f3f3f3f;
  18. struct node{
  19. double x, y, l;
  20. int v, id;
  21. }p[maxn], s[maxn], q[maxn];
  22. int n, top;
  23. double dis(node a, node b){
  24. return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
  25. }
  26. bool cmp(node a, node b){
  27. double A = atan2((a.y - p[].y), (a.x - p[].x));
  28. double B = atan2((b.y - p[].y), (b.x - p[].x));
  29. if(A != B) return A < B;
  30. else{
  31. return dis(a, p[]) < dis(b, p[]);
  32. }
  33. }
  34. double cross(node a, node b, node c){ //(a->b)X(a->c)
  35. return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
  36. }
  37. void solve(){
  38. int pos = ;
  39. for(int i = ; i <= n; i++){
  40. if(p[i].y < p[pos].y || (p[i].y == p[pos].y && p[i].x < p[pos].x)){
  41. pos = i;
  42. }
  43. }
  44. swap(p[], p[pos]);
  45. sort(p + , p + n + , cmp);
  46. s[] = p[], s[] = p[];
  47. top = ;
  48. for(int i = ; i <= n; i++){
  49. while(top >= && cross(s[top - ], p[i], s[top]) >= ){
  50. top--;
  51. }
  52. s[++top] = p[i];
  53. }
  54. }
  55. double need(double len){
  56. if(n <= ) return len;
  57. if(n == ){
  58. return len - 2.0 * dis(p[], p[]);
  59. }
  60. solve();
  61. double Need = ;
  62. for(int i = ; i < top; i++){
  63. Need += dis(s[i], s[i + ]);
  64. }
  65. Need += dis(s[top], s[]);
  66. return len - Need;
  67. }
  68. int main(){
  69. int N, ca = ;
  70. while(~scanf("%d", &N) && N){
  71. for(int i = ; i < N; i++){
  72. scanf("%lf%lf%d%lf", &q[i].x, &q[i].y, &q[i].v, &q[i].l);
  73. q[i].id = i + ;
  74. }
  75. int sz = , que[], tempQue[];
  76. int MinValue = INF;
  77. double ans = ;
  78. for(int i = ; i < ( << N); i++){
  79. int num = , value = ;
  80. double len = ;
  81. n = ;
  82. for(int j = ; j < N; j++){
  83. if(i & ( << j)){
  84. p[++n] = q[j];
  85. }
  86. else{
  87. value += q[j].v;
  88. len += q[j].l;
  89. tempQue[num] = q[j].id;
  90. num++;
  91. }
  92. }
  93. if(value > MinValue) continue;
  94. double tmp = need(len);
  95. if(tmp < ) continue;
  96. if(value < MinValue || (value == MinValue && num < sz)){
  97. MinValue = value;
  98. ans = tmp;
  99. sz = num;
  100. for(int j = ; j < num; j++){
  101. que[j] = tempQue[j];
  102. }
  103. }
  104. }
  105. if(ca != ) printf("\n");
  106. printf("Forest %d\n", ca++);
  107. printf("Cut these trees: ");
  108. for(int i = ; i < sz; i++){
  109. printf("%d ", que[i]);
  110. }
  111. printf("\n");
  112. printf("Extra wood: %.2lf\n", ans);
  113. }
  114. return ;
  115. }

POJ 1873 The Fortified Forest(凸包)题解的更多相关文章

  1. POJ 1873 The Fortified Forest [凸包 枚举]

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6400   Accepted: 1 ...

  2. POJ 1873 - The Fortified Forest 凸包 + 搜索 模板

    通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...

  3. POJ 1873 The Fortified Forest 凸包 二进制枚举

    n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...

  4. 简单几何(凸包+枚举) POJ 1873 The Fortified Forest

    题目传送门 题意:砍掉一些树,用它们做成篱笆把剩余的树围起来,问最小价值 分析:数据量不大,考虑状态压缩暴力枚举,求凸包以及计算凸包长度.虽说是水题,毕竟是final,自己状压的最大情况写错了,而且忘 ...

  5. POJ 1873 The Fortified Forest(枚举+凸包)

    Description Once upon a time, in a faraway land, there lived a king. This king owned a small collect ...

  6. ●POJ 1873 The Fortified Forest

    题链: http://poj.org/problem?id=1873 题解: 计算几何,凸包 枚举被砍的树的集合.求出剩下点的凸包.然后判断即可. 代码: #include<cmath> ...

  7. POJ 1873 The Fortified Forest

    题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树.. 思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行. ...

  8. poj1873 The Fortified Forest 凸包+枚举 水题

    /* poj1873 The Fortified Forest 凸包+枚举 水题 用小树林的木头给小树林围一个围墙 每棵树都有价值 求消耗价值最低的做法,输出被砍伐的树的编号和剩余的木料 若砍伐价值相 ...

  9. Uva5211/POJ1873 The Fortified Forest 凸包

    LINK 题意:给出点集,每个点有个价值v和长度l,问把其中几个点取掉,用这几个点的长度能把剩下的点围住,要求剩下的点价值和最大,拿掉的点最少且剩余长度最长. 思路:1999WF中的水题.考虑到其点的 ...

随机推荐

  1. EXTENDED LIGHTS OUT (高斯消元)

    In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual ...

  2. session_start 统计实时访客人数

    void Session_Start(object sender, EventArgs e) { Application.Lock(); Application["OnLine"] ...

  3. java 序列化和反序列化的实现原理

    老是听说序列化反序列化,就是不知道到底什么是序列化,什么是反序列化?今天就在网上搜索学习一下,这一搜不要紧,发现自己曾经用过,竟然不知道那就是JDK类库中序列化和反序列化的API. ----什么是序列 ...

  4. 20165305 苏振龙《Java程序设计》第五周学习总结

    第七章 Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类. 和某类有关的匿名类就是该类的一个子类,该子类没有明显的用类声明来定义,所以称做匿名类. 和某接口有 ...

  5. django 常用方法总结 < 手写分页-上传头像-redis缓存,排行 ...>

    1.不使用自带模块<Paginator>的手写分页功能views.pydef post_list(request): page = request.GET.get('page', 1) # ...

  6. django -- 修改admin 密码问题

    1.python manage.py shell 2.from django.contrib.auth.models import User 3.user=User.objects.get(usern ...

  7. .net core创建项目(指令方式)

    所谓的指令创建项目,就是不用再已安装的VS2015的环境下或者VS Core下创建,直接通过DOS指令创建也是OK的. 1.找到你所准备保存项目的项目文件夹(你也可以到某个目录用指令创建项目文件夹[  ...

  8. GoldenGate 12.3 MA架构介绍系列(1) - 安装

    GoldenGate 12.3微服务架构与传统架构的区别可参考: http://www.cnblogs.com/margiex/p/7439574.html 下载地址:http://www.oracl ...

  9. dropout——gluon

    https://blog.csdn.net/lizzy05/article/details/80162060 from mxnet import nd def dropout(X, drop_prob ...

  10. FFMPEG编译参数解析

    Standard options: 基本选项参数 --help 显示此帮助信息|print this message --log[=FILE|yes|no] 记录测试并输出到config.err文件| ...