题目大意:世界由几个互不重叠领土但彼此敌对的国家组成,每个国家有一个发电站,负责给本国发电。

1,给出每个国家的建筑数(包括发电站和房子数),每个国家用最少的围墙将本国保护起来(凸包);

2,现在有不定数量的飞毛腿导弹开始袭击这些国家,给出导弹落地点,落在某国区域内,某国直接玩完,以该国面积为大小的区域不能发电;

3,求出最后所有不能发电区域的总面积;

解题策略:

算法思路:求出每个国家的凸包并计算面积——导弹挨个判定在不在凸包内——若在,则累加当前凸包面积

注意:若某国家之前被导弹袭击过,之后再被袭击的话,面积只能算一次;

PS:这题临睡前抱着试试的态度做了下,按照自己的理解,设计好数据结构和算法,没想到1A,时间已是2:00,爽爆了!!!有木有!!!

明天一早还要编译原理,目测明天事情也比较多,苦逼了,速度睡觉!!!

/*UVA 109 SCUD BustersAC by J_DarkON 2013/5/7 2:20    根本没想到会1A啊!!!!!爽爆了!!!!!!Time 0.015s
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 110;
/
struct point{double x, y;point(double a, double b){x = a;y = b;}
};
struct Kingdom{double area;bool use;int top;vector<int> CH;Kingdom(){area = 0;top = 1;CH.clear();CH.resize(maxn);CH[0] = 0;CH[1] = 1;use = false;  //未被导弹袭击}
};
vector<point> P, M; //临时点集  导弹
vector< vector<point> > kdNode; //记录国家点的信息
vector<Kingdom> KD;  //国家
int nodeNum;
double ansArea=0;  //不能发电区域面积
/
void Input(){P.clear();//M.clear();//CH.clear();double xx, yy;if(nodeNum != -1){for(int i=0; i<nodeNum; i++){cin >> xx >> yy;P.push_back(point(xx, yy));}kdNode.push_back(P);}else{while(cin >> xx >> yy)M.push_back(point(xx, yy));}
}//求凸包
bool cmp(point a, point b){if(a.y == b.y)  return a.x < b.x;return a.y < b.y;
}
//判断向量p2-pp是否在向量p1-p2右侧
bool turnRight(point p1, point p2, point pp){const double eps = 1e-20;if((p2.x - p1.x)*(pp.y - p2.y) - (pp.x - p2.x)*(p2.y - p1.y) <= eps) return true;return false;
}
//计算叉积
double multi(point p0, point p1, point p2){return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}void Compute(){//计算每个国家的凸包//cout << kdNode.size() << endl << endl;for(int k=0; k<kdNode.size(); k++){sort(kdNode[k].begin(), kdNode[k].end(), cmp);KD.push_back(Kingdom());//从起点0到到排序最后点作凸包右链  过程1for(int i=2; i<kdNode[k].size(); i++){while( KD[k].top && turnRight(kdNode[k][KD[k].CH[KD[k].top-1]], kdNode[k][KD[k].CH[KD[k].top]], kdNode[k][i]) ){KD[k].top--;}KD[k].CH[++KD[k].top] = i;}int len = KD[k].top;//从排序最高点到到起点0fab反向作凸包右链  过程2KD[k].CH[++KD[k].top] = kdNode[k].size()-2;for(int i=kdNode[k].size()-3; i>=0; i--){//KD[k].top!=len, 不考虑已在过程1生成凸包上的点while( KD[k].top!=len && turnRight(kdNode[k][KD[k].CH[KD[k].top-1]], kdNode[k][KD[k].CH[KD[k].top]], kdNode[k][i]) ){KD[k].top--;}KD[k].CH[++KD[k].top] = i;}//计算每个国家凸包面积for(int i=1; i<KD[k].top-1; i++){KD[k].area += multi(kdNode[k][KD[k].CH[0]], kdNode[k][KD[k].CH[i]], kdNode[k][KD[k].CH[i+1]]);}//printf("KD[%d].area = %lf\n", k, KD[k].area);//判断导弹是否袭击当前国家for(int m=0; m<M.size(); m++){if(KD[k].use)  break;  //该国家之前已被导弹摧毁for(int i=0; i<KD[k].top-1; i++){if(!turnRight(kdNode[k][KD[k].CH[i]], kdNode[k][KD[k].CH[(i+1)%KD[k].top]], M[m]))//若点M[m]在凸包边左侧KD[k].use = true; //该国家可能会被袭击else{KD[k].use = false; //点M[m]不在凸包内部,导弹无法袭击break;}}if(KD[k].use){  //该国家已被当前导弹摧毁ansArea += KD[k].area;break;}}}printf("%.2lf\n", ansArea/2);  //由于按方向分解凸包时,叉积计算为三角形有效面积2倍,故总和应除以2
}/
int main(){while(cin >> nodeNum){Input();if(nodeNum == -1)  Compute();}return 0;
}

UVA 109 SCUD Busters【凸包模拟题】相关推荐

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

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

  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. UVA 109 || SCUD Busters(凸包面积计算

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

  6. UVa 109 - SCUD Busters(凸包)

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

  7. poj 1264 || UVA 109 SCUD Busters

    UVA这题过得蛮多人的,觉得应该是个水题吧. 一读题,也不麻烦,给你N个王国,求下凸包,再求面积.给你一些炮弹,问炮弹炸掉的面积.(一个炮弹炸的话,整个王国都被炸了). 直接求凸包后,求出各个王国的面 ...

  8. UVa 109 - SCUD Busters

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

  9. UVa Problem 109 - SCUD Busters

    // UVa Problem 109 - SCUD Busters // Verdict: Accepted // Submission Date: 2011-11-24 // UVa Run Tim ...

最新文章

  1. Axis2 -POJO
  2. 民主湖呀,不知道是好看还是破烂
  3. 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
  4. Linux进程实践(4) --wait避免僵尸进程
  5. [SDOI2006] 保安站岗
  6. linux创建sudo用户_Linux终极指南-创建Sudo用户
  7. @MapperScan扫描包的问题
  8. 将Sublime Text 2配置为C#代码编辑器(附配置文件)
  9. ubuntu常见错误及解决
  10. Mac用brew安装mysql
  11. 毕业设计资料python RCQ读者书库程序源码加文档
  12. DTU接入ZWS云的通信协议
  13. 基于双目摄像头测量距离
  14. 百度一面 / 二面 总结
  15. 吐血总结《Mysql从入门到入魔》,图文并茂
  16. cadence学习资料整理
  17. 裴波那契数列及其递归算法
  18. 一些有趣的鸽巢原理的题目
  19. 今天用Excel做一颗圣诞树,小伙伴们都惊呆了!
  20. 代码分享 | EEG数据的等效偶极子源定位

热门文章

  1. 用酒精Alcohol 120%刻WI-IC的OS简单教程
  2. 【NER】EMNLP 2020 命名实体识别
  3. sizebox模型下载_【gts游戏】sizebox的一些功能介绍以及使用教程
  4. 【Qt】【编译】【问题】无法定位程序输入点  ***  于动态链接库
  5. Mac OS X 10.10 + WineBottler + XQuartz 成功运行 诛仙3
  6. 如何给表添加新的字段
  7. Kafka、RocketMQ、RabbitMQ的对比
  8. 叮咚!您有一份2017杭州云栖大会参会指南待签收【持续更新中】
  9. boost配置(VC/CodeBlocks)与编译(bjam+msvc/mingW)
  10. IP地址库解析——读取IP地址获得实际地理位置信息的java源码实现