比赛的时候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 守护雅典娜相关推荐

  1. HDU 4562 守护雅典娜(dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  2. hdu 4562 守护雅典娜(计算几何+dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  3. hdu4562 守护雅典娜 DP

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  4. 杭电acm4562守护雅典娜 (dp+圆)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  5. HDU4562 守护雅典娜(DP)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

  6. 守护雅典娜 HDU-4562

    vj链接: 守护雅典娜 题目描述: 许多塔防游戏都是以经典的"守护雅典娜"为原型的.玩家需要建立各种防御工具来阻止怪物接近我们的女神--雅典娜. 这里,我们可以建造的防御工具只有标 ...

  7. HDU 4562 守护雅典娜(金山复赛第二场)

    题意是塔防建塔,要求建最多塔 然后符合的情况是: rt 红色是允许的,蓝色是不允许的 输入时选择红色的 然后dp1 ath的圈,再dp2 mon的圈,最后dp3这两种圈的总和 dp1和dp2中能增加的 ...

  8. hdu 4562 守护雅典娜 (Simple Geometry + dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=4562 中文题. 这道题的做法是先筛选出那些能够起到分隔雅典娜和怪兽的圆,就是那些只包围雅典娜或者只包围怪兽的圆, ...

  9. HDU 4562 守护雅典娜(动态规划)

    答案分为三种只能只有包含雅典娜的塔,只有包含怪兽的塔,包含雅典娜和怪兽的塔的和. 使用dp可以分别计算包含雅典娜.怪兽的最厚塔层数,过程类似LIS.枚举这两种情况的塔数,求和计算第三种情况. #inc ...

最新文章

  1. skywalking原理_Skywalking系列博客6手把手教你编写 Skywalking 插件
  2. C++中左移操作符的重载
  3. 重启redis命令_redis系列之——数据持久化(RDB和AOF)
  4. UDP、广播、多播与IGMP(七)
  5. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(十一)恢复右键、选择和复制
  6. jvm调优:使用jconsole监控Jboss
  7. 使用Subversion进行版本控制 附录A
  8. javaweb(二十一)——JavaWeb的两种开发模式
  9. 如何拉取公网RTSP/RTMP流在内网多客户端播放
  10. JVM—垃圾回收GC算法
  11. linux mount 默认读写,Linux mount 修改文件系统的读写属性
  12. flask框架_Flask框架的入门:Hello world
  13. Spring Security 3多用户登录实现之二 多登录界面展示
  14. 正则表达式匹配连续相同字符
  15. postgresql数据库进行等保测评(审计) 需要修改的参数
  16. 名词后面用过去分词的具体用法是怎么样的?
  17. if or函数套用_5个IF函数操作,让你轻松掌握条件判断和嵌套运用
  18. 改变鼠标样式的两种方法
  19. 靠这个方法,我终于月入3万!
  20. 方差分析及其在Excel、SPSS中的应用

热门文章

  1. python 保存csv,Python数据存储到文件的3种方式
  2. Vulkan系列教程—VMA教程(一)—快速上手VMA
  3. Python做小学四年级奥数题算三个人的年龄
  4. 不善言谈比较难成为优秀CIO(I)--向CEO阐明IT的价值所在
  5. 结合C4D和AE制作产品广告动画视频教程
  6. kali linux无法获取IP地址的解决过程
  7. stacking 的代码实现
  8. 瑞萨e2studio(19)----RTC时钟日历闹钟周期性中断
  9. Linux基础与应用---文件操作
  10. 22 个必知编程语言之「Kotlin」