HDOJ - 4562/西山居复赛2 守护雅典娜
比赛的时候WA得一塌糊涂~~原因!..读题粗心了!!上一题的输出是Case #1: 0 , 而本题居然是Case 1: 1 ... 同一套题..神坑...
思路很简单了..能产生防御效果的..无非是能包住雅典娜或者包住怪兽的圆..而当一个圆同时包住了雅典娜和怪兽..同样也没有了防御效果..
考虑N个圆包住一个点并且互不相交/切能取最多圆的个数问题..用dp解决..dp顺序按照圆的半径从小到大(很明显,一个圆要包住另一个圆,其半径必须比它大)...
分别算出了包住雅典娜dp[0][],包住怪兽的dp值dp[1][]..再找两个不相冲突能得到的最大圆个数...既是答案..
Program:
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define pi acos(-1.0)
#define ll long long
#define oo 1000000000
#define MAXN 1005
using namespace std;
struct node
{int x,y,r;
}a[MAXN];
int n,x,y,sum[2][MAXN];
bool cmp(node a,node b)
{return a.r<b.r;
}
bool ok(node a,node b) // 判断两个圆是否不相交/切
{int d,r1,r2;d=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); r1=a.r-b.r; r2=a.r+b.r;if (r1*r1<=d && d<=r2*r2) return false; return true;
}
int main()
{ int T,t,i,j,ans; scanf("%d",&T);for (t=1;t<=T;t++){ scanf("%d%d%d",&n,&x,&y);for (i=1;i<=n;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].r);sort(a+1,a+1+n,cmp); ans=0;memset(sum,0,sizeof(sum));for (i=1;i<=n;i++){if (a[i].x*a[i].x+a[i].y*a[i].y>=a[i].r*a[i].r ||(a[i].x-x)*(a[i].x-x)+(a[i].y-y)*(a[i].y-y)<=a[i].r*a[i].r ) //找出包住雅典娜,但又包不住怪兽的圆continue; for (j=1;j<i;j++)if (sum[0][i]<sum[0][j] && ok(a[i],a[j]))sum[0][i]=sum[0][j];sum[0][i]++; ans=max(ans,sum[0][i]);} for (i=1;i<=n;i++){if (a[i].x*a[i].x+a[i].y*a[i].y<=a[i].r*a[i].r ||(a[i].x-x)*(a[i].x-x)+(a[i].y-y)*(a[i].y-y)>=a[i].r*a[i].r ) //找出包住怪兽,但又包不住雅典娜的圆continue; for (j=1;j<i;j++)if (sum[1][i]<sum[1][j] && ok(a[i],a[j]))sum[1][i]=sum[1][j];sum[1][j]++;ans=max(ans,sum[1][i]);} for (i=1;i<=n;i++)for (j=1;j<=n;j++)if (ans<sum[0][i]+sum[1][j] && ok(a[i],a[j])) ans=sum[0][i]+sum[1][j]; // 合并两个结果printf("Case %d: %d\n",t,ans);}return 0;
}
HDOJ - 4562/西山居复赛2 守护雅典娜相关推荐
- HDU 4562 守护雅典娜(dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- hdu 4562 守护雅典娜(计算几何+dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- hdu4562 守护雅典娜 DP
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- 杭电acm4562守护雅典娜 (dp+圆)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- HDU4562 守护雅典娜(DP)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
- 守护雅典娜 HDU-4562
vj链接: 守护雅典娜 题目描述: 许多塔防游戏都是以经典的"守护雅典娜"为原型的.玩家需要建立各种防御工具来阻止怪物接近我们的女神--雅典娜. 这里,我们可以建造的防御工具只有标 ...
- HDU 4562 守护雅典娜(金山复赛第二场)
题意是塔防建塔,要求建最多塔 然后符合的情况是: rt 红色是允许的,蓝色是不允许的 输入时选择红色的 然后dp1 ath的圈,再dp2 mon的圈,最后dp3这两种圈的总和 dp1和dp2中能增加的 ...
- hdu 4562 守护雅典娜 (Simple Geometry + dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4562 中文题. 这道题的做法是先筛选出那些能够起到分隔雅典娜和怪兽的圆,就是那些只包围雅典娜或者只包围怪兽的圆, ...
- HDU 4562 守护雅典娜(动态规划)
答案分为三种只能只有包含雅典娜的塔,只有包含怪兽的塔,包含雅典娜和怪兽的塔的和. 使用dp可以分别计算包含雅典娜.怪兽的最厚塔层数,过程类似LIS.枚举这两种情况的塔数,求和计算第三种情况. #inc ...
最新文章
- skywalking原理_Skywalking系列博客6手把手教你编写 Skywalking 插件
- C++中左移操作符的重载
- 重启redis命令_redis系列之——数据持久化(RDB和AOF)
- UDP、广播、多播与IGMP(七)
- JavaScript——易班优课YOOC课群在线测试自动答题解决方案(十一)恢复右键、选择和复制
- jvm调优:使用jconsole监控Jboss
- 使用Subversion进行版本控制 附录A
- javaweb(二十一)——JavaWeb的两种开发模式
- 如何拉取公网RTSP/RTMP流在内网多客户端播放
- JVM—垃圾回收GC算法
- linux mount 默认读写,Linux mount 修改文件系统的读写属性
- flask框架_Flask框架的入门:Hello world
- Spring Security 3多用户登录实现之二 多登录界面展示
- 正则表达式匹配连续相同字符
- postgresql数据库进行等保测评(审计) 需要修改的参数
- 名词后面用过去分词的具体用法是怎么样的?
- if or函数套用_5个IF函数操作,让你轻松掌握条件判断和嵌套运用
- 改变鼠标样式的两种方法
- 靠这个方法,我终于月入3万!
- 方差分析及其在Excel、SPSS中的应用