UVA这题过得蛮多人的,觉得应该是个水题吧。

一读题,也不麻烦,给你N个王国,求下凸包,再求面积。给你一些炮弹,问炮弹炸掉的面积。(一个炮弹炸的话,整个王国都被炸了)。

直接求凸包后,求出各个王国的面积,然后判断炮弹在哪个王国里,这个直接用判断点是否在多边形内。

UVA WA了一次,如果多个炮弹打到同一个王国里,面积只算一次的,改了后,A掉了。

poj上一搜,居然也有这题。。才100+人过 = =。。。其实套套模板就过去了,不过套得时候很没信心啊。。。那么长。。

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int MAX = 110; struct point{ double x,y;}; //点 struct polygon{ point c[MAX],a; double area; int n;}; struct segment{ point a,b;}; // 线段 const double eps = 1e-6; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y polygon king[MAX]; point c[MAX]; double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } double disp2p(point a,point b) { return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); } double area_polygon(point p[],int n) { double s = 0.0; for(int i=0; i<n; i++) s += p[(i+1)%n].y * p[i].x - p[(i+1)%n].x * p[i].y; return fabs(s)/2.0; } bool cmp(point a,point b) // 排序 { double len = crossProduct(c[0],a,b); if( dd(len,0.0) ) return xy(disp2p(c[0],a),disp2p(c[0],b)); return xy(len,0.0); } bool onSegment(point a, point b, point c) { double maxx = max(a.x,b.x); double maxy = max(a.y,b.y); double minx = min(a.x,b.x); double miny = min(a.y,b.y); if( dd(crossProduct(a,b,c),0.0) && dyd(c.x,minx) && xyd(c.x,maxx) && dyd(c.y,miny) && xyd(c.y,maxy) ) return true; return false; } bool segIntersect(point p1,point p2, point p3, point p4) { double d1 = crossProduct(p3,p4,p1); double d2 = crossProduct(p3,p4,p2); double d3 = crossProduct(p1,p2,p3); double d4 = crossProduct(p1,p2,p4); if( xy(d1 * d2,0.0) && xy(d3 * d4,0.0) ) return true; if( dd(d1,0.0) && onSegment(p3,p4,p1) ) return true;//如果不判端点相交,则下面这四句话不需要 if( dd(d2,0.0) && onSegment(p3,p4,p2) ) return true; if( dd(d3,0.0) && onSegment(p1,p2,p3) ) return true; if( dd(d4,0.0) && onSegment(p1,p2,p4) ) return true; return false; } bool point_inPolygon(point pot,point p[],int n) { int count = 0; segment l; l.a = pot; l.b.x = 1e10*1.0; l.b.y = pot.y; p[n] = p[0]; for(int i=0; i<n; i++) { if( onSegment(p[i],p[i+1],pot) ) return true; if( !dd(p[i].y,p[i+1].y) ) { int tmp = -1; if( onSegment(l.a,l.b,p[i]) ) tmp = i; else if( onSegment(l.a,l.b,p[i+1]) ) tmp = i+1; if( tmp != -1 && dd(p[tmp].y,max(p[i].y,p[i+1].y)) ) count++; else if( tmp == -1 && segIntersect(p[i],p[i+1],l.a,l.b) ) count++; } } if( count % 2 == 1 ) return true; return false; } point stk[MAX]; int top; double Graham(int n) { int tmp = 0; for(int i=1; i<n; i++) if( xy(c[i].x,c[tmp].x) || dd(c[i].x,c[tmp].x) && xy(c[i].y,c[tmp].y) ) tmp = i; swap(c[0],c[tmp]); sort(c+1,c+n,cmp); stk[0] = c[0]; stk[1] = c[1]; top = 1; for(int i=2; i<n; i++) { while( xyd( crossProduct(stk[top],stk[top-1],c[i]), 0.0 ) && top >= 1 ) top--; stk[++top] = c[i]; } return area_polygon(stk,top+1); } int main() { int n; int i = 0; double x,y; while( ~scanf("%d",&n) && n != -1 ) { king[i].n = n; for(int k=0; k<n; k++) scanf("%lf %lf",&king[i].c[k].x,&king[i].c[k].y); king[i].a = king[i].c[0]; i++; } double sum = 0.0; for(int k=0; k<i; k++) { memcpy(c,king[k].c,sizeof(king[k].c)); king[k].area = Graham(king[k].n); memcpy(king[k].c,stk,sizeof(stk)); king[k].n = top+1; } point pot; bool die[MAX]; memset(die,false,sizeof(die)); while( ~scanf("%lf %lf",&pot.x,&pot.y) ) { for(int k=0; k<i; k++) if( point_inPolygon(pot,king[k].c,king[k].n) && !die[k] ) { die[k] = true; sum += king[k].area; } } printf("%.2lf/n",sum); return 0; }

poj 1264 || UVA 109 SCUD Busters相关推荐

  1. UVA 109 SCUD Busters【凸包模拟题】

    题目大意:世界由几个互不重叠领土但彼此敌对的国家组成,每个国家有一个发电站,负责给本国发电. 1,给出每个国家的建筑数(包括发电站和房子数),每个国家用最少的围墙将本国保护起来(凸包): 2,现在有不 ...

  2. UVa 109 - SCUD Busters(凸包计算)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  3. uva 109 SCUD Busters

    原题: 109 SCUD Bust ers Background Some problems are difficult to solve but h e a simplification that ...

  4. uva 109 SCUD Busters

    题意:有很多国家,国家的边界是包括房子和发电站的凸包,当发动战争是,会用飞毛腿导弹摧毁对方的发电站,则这个国家就会灭亡,给出每个国家的点的集合,包括房子和发电站,给出炮弹可以打中的点,计算出被摧毁的国 ...

  5. poj 1264 hdu 1616 SCUD Busters 凸包+面积计算

    http://poj.org/problem?id=1264 这题很看郁闷,看了很久才明白是什么意思.大致就是有数个国家,每个国家有数个房子,房子相互连接组成的最小周长的多边形为该国家领土,当输入-1 ...

  6. UVa 109 SCUD Busters (凸包面积判断点是否在凸包内部)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. UVA 109 || SCUD Busters(凸包面积计算

    = = 模板水题.看数据就可以做了. 输出被炸弹轰炸之后,所有王国停电的总面积,保留小数点后两位. 题目中说到每个王国的边界是围城这些点的最小周长,所以可以推出,每个王国都是一个凸包圈住的点集: 第一 ...

  8. UVa 109 - SCUD Busters

    题目:红警0 0?有一些国家,给出国家被围墙围了起来,围墙内的范围都属于这个国家,现在要发射一些导弹,如果导弹落到国家内,那对应的国家就会停电,现在问停电的总面积. 分析:计算几何.凸包.点与多边形关 ...

  9. UVa 109 - SCUD Busters(凸包)

    题意:输入n个国家,每个国家一些点,用围墙(多边形)围起来,围墙内的范围都属于这个国家,现在要发射一些导弹,如果导弹落到国家内,那对应的国家就会停电,现在问停电的总面积. 分析:1,求凸包,Graha ...

最新文章

  1. cocos2dx 2.2.5 hitWidget-onTouchEnded(pTouch, pEvent); 异常
  2. 在线计算机多功能,一种多功能组合计算机制造技术
  3. 微信,QQ这类IM app怎么做——谈谈Websocket
  4. territory pop up window是否显示的逻辑,和transaction type差不多
  5. Opencv基础画图函数——line、circle、rectangle、Rect、ellipse、polylines、putText函数的用法
  6. Erlang消息传递-tut15.erl
  7. MATLAB App Designer GUI开发从0到1(二)
  8. Asp.net MVC中如何获取控制器的名称
  9. 简单混淆密码加密和解密
  10. 实验3.2 定义一个简单的Computer类
  11. Hive_Hive的数据模型_视图
  12. 蚂蚁移动开发平台 mPaaS 3.0 智能化 + 生态化 1
  13. LaTeX详细教程+技巧总结
  14. 量子计算机基本信息单位,量子计算机.ppt
  15. 渐变按钮 css,CSS3 Gradient Buttons
  16. 口红会染唇是什么意思_最强科普!口红、唇膏、唇釉、染唇液究竟区别在哪?...
  17. jmeter性能测试方案
  18. 原生js中attributes属性
  19. 大商创x支持mysql版本_大商创x全面升级2.0,匠心打造b2b2c多用户商城系统
  20. 人工智能背后的“人工”: 数据标注时薪缩水一半,欠薪高发

热门文章

  1. 项目管理信息系统效益分析报告
  2. python基础概念之-打印一个边长为n的正方形
  3. linux系统远程桌面
  4. Autodesk Inventor Professional 2022.0.1 Update Only x64
  5. 计算机型号或配置,查看电脑各项配置参数的方法
  6. 【STM32学习】(11)STM32 Mifare_One(S50) M1S50的使用(读、写、密钥修改,控制位解读)
  7. DM数据库表空间管理和归档
  8. 用智能音箱+AI 联网玩狼人杀将是怎样的体验?
  9. 物联网会成为移动互联网的下一个红海市场吗
  10. LVGL文件浏览器|基于 lvgl 实现的简洁、通用、轻量级的文件浏览器