uva 10406 Cutting tabletops
Problem D: Cutting tabletops

Bever
Lumber hires beavers to cut wood. The company has recently received a shippment of tabletops. Each tabletop is a convex polygon. However, in this hard economic times of cutting costs the company has ordered
the tabletops from a not very respectable but cheap supplier. Some of the tabletops have the right shape but they are slightly too big. The beavers have to chomp of a strip of wood of a fixed width from each edge of the tabletop such that they get a tabletop
of a similar shape but smaller. Your task is to find the area of the tabletop after beavers are done.
Input consists of a number of cases each presented on a separate line. Each line consists of a sequence of numbers. The first number is d the width of the strip of wood to be cut off of each edge
of the tabletop in centimeters. The next number n is an integer giving the number of vertices of the polygon. The next npairs of numbers present xi and yi coordinates
of polygon vertices for 1 <= i <= n given in clockwise order. A line containing only two zeroes terminate the input.
d is much smaller than any of the sides of the polygon. The beavers cut the edges one after another and after each cut the number of vertices of the tabletop is the same.
For each line of input produce one line of output containing one number to three decimal digits in the fraction giving the area of the tabletop after cutting.
Sample input
2 4 0 0 0 5 5 5 5 0
1 3 0 0 0 5 5 0
1 3 0 0 3 5.1961524 6 0
3 4 0 -10 -10 0 0 10 10 0
0 0
Output for sample input
1.000
1.257
2.785
66.294
Problem Setter: Piotr Rudnicki
题目大意:
顺时针给定你一个凸多边形。问你削去d距离后,这个凸多边形的面积
解题思路:
也就是原来的凸包面积减去全部以凸包边为长度高为d的矩形面积加上多去除的部分(也就是1,2,3,4,5的面积),就是答案
解题代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std; struct point{
double x,y;
point(double x0=0,double y0=0){x=x0;y=y0;}
double xchen(point p){//this X P
return x*p.y-p.x*y;
}
double dchen(point p){//this X P
return x*p.x+y*p.y;
}
double getlen(){
return sqrt ( x*x+y*y );
}
double getdis(point p){
return sqrt( (x-p.x)*(x-p.x) + (y-p.y)*(y-p.y) );
}
}; const double eps=1e-7;
double d;
int n;
vector <point> p; void input(){
p.resize(n);
for(int i=0;i<n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
} void solve(){
double sum=0;
for(int i=1;i<n-1;i++){
point p1=point(p[i].x-p[0].x,p[i].y-p[0].y);
point p2=point(p[i+1].x-p[0].x,p[i+1].y-p[0].y);
sum+=fabs(p2.xchen(p1))/2.0;
}
for(int i=0;i<n;i++){
double dis=p[i].getdis(p[(i+n-1)%n]);
sum-=dis*d;
}
for(int i=0;i<n;i++){
int t1=((i-1)+n)%n,t2=((i+1)+n)%n;
point p1=point(p[t1].x-p[i].x,p[t1].y-p[i].y);
point p2=point(p[t2].x-p[i].x,p[t2].y-p[i].y);
double degree=acos( p1.dchen(p2)/p1.getlen()/p2.getlen() ) /2.0;
double area=d/(tan(degree) )*d;
sum+=area;
}
printf("%.3lf\n",sum);
} int main(){
while(scanf("%lf%d",&d,&n)!=EOF){
if(fabs(d-0.0)<eps && n==0) break;
input();
solve();
}
return 0;
}
uva 10406 Cutting tabletops的更多相关文章
- uva 10003 Cutting Sticks 【区间dp】
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- UVa 10003 - Cutting Sticks(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10003 Cutting Sticks 切木棍 dp
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...
- UVA 10003 Cutting Sticks
题意:在给出的n个结点处切断木棍,并且在切断木棍时木棍有多长就花费多长的代价,将所有结点切断,并且使代价最小. 思路:设DP[i][j]为,从i,j点切开的木材,完成切割需要的cost,显然对于所有D ...
- uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...
- UVA 10003 Cutting Sticks(区间dp)
Description Cutting Sticks You have to cut a wood stick into pieces. The most affordable company ...
- UVA - 10003 Cutting Sticks(切木棍)(dp)
题意:有一根长度为L(L<1000)的棍子,还有n(n < 50)个切割点的位置(按照从小到大排列).你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每次切割的费用 ...
- uva 10003 Cutting Sticks (区间dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 打开 题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一 ...
随机推荐
- Singleton单例对象的使用
namespace www{ public abstract class SingletonManager<T> : ISingletonManager where T : class, ...
- BCTF2017 BabyUse
BCTF2017 BabyUse 问题 问题在于drop函数中在释放块之后没有清空bss_gun_list中的指针. 一般因为存在对bss_gun_flag的验证,所以不会出现什么问题,但是在use功 ...
- free命令中buffers和caches的区别
一.命令 1 2 3 4 5 [root@localhost ~]# free -m total used free shared bu ...
- has the wrong structure
mysql 5.6升级到5.7之后报错 root@localhost:mysql.sock [test]>show variables like '%log%' ; ERROR 1682 (HY ...
- mybatis3中@SelectProvider的使用技巧
mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要 ...
- django URLconf调度程序
路由的编写方式是Django2.0和1.11最大的区别所在,Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...
- kafka配置监控和消费者测试
概念 运维 配置 监控 生产者与消费者 流处理 分区partition 一定条件下,分区数越多,吞吐量越高.分区也是保证消息被顺序消费的基础,kafka只能保证一个分区内消息的有序性 副本 每个分区有 ...
- 当Java遇到XML 的邂逅+dom4j
XML简介: XML:可扩展标记语言! 01.很象html 02.着重点是数据的保存 03.无需预编译 04.符合W3C标准 可扩展:我们可以自定义,完全按照自己的规则来! 标记: 计算机所能认识的信 ...
- 链表用途&&数组效率&&链表效率&&链表优缺点
三大数据结构的实现方式 数据结构 实现方式 栈 数组/单链表 队列 数组/双端链表 优先级队列 数组/堆/有序链表 双端队列 双向链表 数组与链表实现方式的比较 数组与链表都很快 如果能精确预测栈 ...
- Android-IntentFilter
Android-IntentFilter 学习自 <Android开发艺术探索> IntentFilter漫谈 众所周知,在Android中如果要想启动一个Activity,有两种方式,显 ...