博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj - 1873 - The Fortified Forest
阅读量:5736 次
发布时间:2019-06-18

本文共 2450 字,大约阅读时间需要 8 分钟。

题意:给出n棵树的坐标,树的高度和树的价值,从这些树中砍掉一些(整棵整棵的)做围栏把剩余的树围起来,使得消耗的树的价值最小。输出应砍掉哪里些树以及剩余的材料的长度。(如果砍掉的价值相同,则取砍掉数目少的)(2 <= n <= 15)

题目链接:

——>>用二进制映射枚举每种砍树的情况,对于每一种情况,求凸包,求凸包的周长,判断。(这里用G++提交)

注意:1、如果砍掉的价值相同,数目也相同,应砍编号小的树;

2、最后输出时用"%.2f",千万别用"%.2lf",多一个l与少一个l区别大大的大!!!

 

#include 
#include
#include
using namespace std;const int maxn = 15 + 1;const int INF = 1000000000;struct Tree{ double x; double y; int v; int l; Tree(){} Tree(int xx, int yy):x(xx), y(yy){} bool operator < (const Tree& e) const { return x < e.x || (x == e.x && y < e.y); }}t[maxn];Tree operator - (Tree A, Tree B){return Tree(A.x - B.x, A.y - B.y);}double Cross(Tree A, Tree B){return A.x * B.y - A.y * B.x;}double Dis(Tree A, Tree B) {return hypot(A.x - B.x, A.y - B.y);}int ConvexHull(Tree *p, int n, Tree* ch) //求凸包{ sort(p, p + n); int m = 0; for(int i = 0; i < n; i++) { while(m > 1 && Cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) < 0) m--; ch[m++] = p[i]; } int k = m; for(int i = n-2; i >= 0; i--) { while(m > k && Cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) < 0) m--; ch[m++] = p[i]; } if(n > 1) m--; return m;}double Perimeter(Tree *ret, int m){ double perimeter = 0; for(int i = 1; i < m; i++) perimeter += Dis(ret[i], ret[i-1]); perimeter += Dis(ret[0], ret[m-1]); return perimeter;}int main(){ int n, i, Case = 1, bit; while(scanf("%d", &n) == 1 && n) { for(i = 0; i < n; i++) scanf("%lf%lf%d%d", &t[i].x, &t[i].y, &t[i].v, &t[i].l); int min_val = INF; //砍掉的最小价值 int min_cnt = INF; //砍掉的最小价值时砍掉的树的数量 double exc_len = 0; //做好围栏后剩余木材长度 int ans = 0; //砍掉的方法,二进制映射 for(bit = 0; bit < (1<
min_val) continue; cut_cnt = n - m; int cnt = ConvexHull(buf, m, ret); //求凸包 double perimeter = Perimeter(ret, cnt); //凸包周长 if(cut_len >= perimeter) //砍掉的树满足长度要求 { if(cut_val < min_val || (cut_val == min_val && cut_cnt < min_cnt)) { min_val = cut_val; min_cnt = cut_cnt; exc_len = cut_len - perimeter; ans = bit; } } } if(Case > 1) printf("\n"); printf("Forest %d\n", Case++); printf("Cut these trees:"); for(i = 0; i < n; i++) if(ans&(1<

 

 

转载地址:http://umrwx.baihongyu.com/

你可能感兴趣的文章
Nginx反向代理1--基本介绍-虚拟主机
查看>>
${pageContext.request.contextPath}
查看>>
java中循环的不同终止方式
查看>>
【测试基础】为人所知的那些事
查看>>
webpack4 系列教程(十二):处理第三方JavaScript库
查看>>
第一部分 Python如何运行
查看>>
图片嵌入-大容量的信息隐藏算法
查看>>
NAND flash和NOR flash的区别详解
查看>>
《小学生之噩梦》 用户规格说明书
查看>>
kaldi特征处理
查看>>
Android 防止控件被重复点击
查看>>
POJ3077 Rounders
查看>>
uva 712 S-Trees
查看>>
<botton>与<input type="button">的区别
查看>>
A Tour of Go Exercise: HTTP Handlers
查看>>
【alpha阶段】第八次Scrum Meeting
查看>>
iOS 判断输入是否全是空格
查看>>
认证客户端的链接与socketserver实现并发
查看>>
为什么选择.NETCore?
查看>>
15总结。(转)
查看>>