题意:



思路:

这题巨坑!!!

这题巨坑!!!

这题巨坑!!!

这题巨坑!!!

这题巨坑!!!

(而且没有题解…….5555555……)

只能照着自己想的写了……

  • 先求出来凸包

    求凸包的方法呢:先找出来左下角的点 然后按照极角排序就OK了。

    我用了两边sort

    sort(point+1,point+1+n,cmp);

    sort(point+2,point+1+n,cmp2);

    第一遍sort:
bool cmp(Point a,Point b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}

找出来左下角的点

第二遍sort:

bool cmp2(Point a,Point b){return (long long)(a.x-point[1].x)*(b.y-point[1].y)-(long long)(a.y-point[1].y)*(b.x-point[1].x)>0;}

按照极角找到了凸包 (注意是从2号点开始排的序)

Caution: tmd一定要用long long 100000*100000会挂的很惨 (我就是有一个点死活过不去 幸亏队长比较机智)

  • 两边for暴力枚举一下两个柱子中间是否能连线段(相邻的不能连 所以j就从i+2–>n枚举好了)

    一定要注意i=1&j=n的情况 (否则自己怎么死的都不知道)

    ok[i][j]表示i能跟j相连
    for(int i=1;i<=n;i++)
for(int j=i+2;j<=n;j++)
if(check(i,j)&&(i!=1||j!=n))ok[i][j]=1;
  • 接下来就要挟坑爹的check函数了……

    我的方法是余弦定理乱搞(乱搞都写错了……)

    设A, B为线段的两个端点,C为圆心。

    圆心到线段的距离<=r就不能连….

    怎么求圆心到线段的距离呢 这时候要分情况讨论了

1.角A或者角B为钝角 这个时候只需判断AC和BC的距离是否大于r就OK了 (一开始我没有想到这个 挂的很惨)

2.知道三边 能够求出cosa(COSA=(B*B+C*C-A*A)/(2*B*C))

继而倒出SINA(cosa*cosa+sina*sina=1)

这个时候我发现 WOC!我的精度!!!!(OMG) 因为有些误差,相切的情况我没有判出来 囧么办? +个eps好了….

于是我就加了个eps

  • 随后就是区间DP了

    f[i][j]=max(f[i][k]+f[k][j])+ok[i][j]

    (没有人傻到像我一样先枚举i,j,再枚举k了吧……)

    (然后我就果断改了啊)
    for(int lenth=2;lenth<=n;lenth++)
for(int start=1;start<=n;start++){
int end=start+lenth;
for(int k=start+1;k<min(end,n);k++)
f[start][end]=max(f[start][end],f[start][k]+f[k][end]);
f[start][end]+=ok[start][end];
}

这题真是步步为坑啊……………….

// by SiriusRen
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
bool ok[255][255];
int n,g,r,f[255][155];
struct Point{int x,y;}point[255];
struct Circle{int x,y;}circle[255];
bool check(int a,int b){
double sx=1.0*point[a].x,sy=1.0*point[a].y;
double ex=1.0*point[b].x,ey=1.0*point[b].y;
double C=sqrt(1.0*(sy-ey)*(sy-ey)+1.0*(sx-ex)*(sx-ex));
for(int i=1;i<=g;i++){
double A=sqrt((circle[i].x-sx)*(circle[i].x-sx)+(circle[i].y-sy)*((circle[i].y-sy)));
double B=sqrt((circle[i].x-ex)*(circle[i].x-ex)+(circle[i].y-ey)*((circle[i].y-ey)));
double COSA=(B*B+C*C-A*A)/(2*B*C);
double COSB=(A*A+C*C-B*B)/(2*A*C);
if(COSA<1e-10||COSB<1e-10){
if(A<1.0*r+1e-10||B<1.0*r+1e-10)return 0;
else continue;
}
double SINA=sqrt(1-COSA*COSA);
double H=B*SINA;
if(H<1.0*r+1e-10)return 0;
}
return 1;
}
bool cmp(Point a,Point b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
bool cmp2(Point a,Point b){return (long long)(a.x-point[1].x)*(b.y-point[1].y)-(long long)(a.y-point[1].y)*(b.x-point[1].x)>0;}
int main(){
scanf("%d%d%d",&n,&g,&r);
for(int i=1;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+1,point+1+n,cmp);
sort(point+2,point+1+n,cmp2);
for(int i=1;i<=g;i++)
scanf("%d%d",&circle[i].x,&circle[i].y);
for(int i=1;i<=n;i++)
for(int j=i+2;j<=n;j++)
if(check(i,j)&&(i!=1||j!=n))ok[i][j]=1;
for(int lenth=2;lenth<=n;lenth++)
for(int start=1;start<=n;start++){
int end=start+lenth;
for(int k=start+1;k<min(end,n);k++)
f[start][end]=max(f[start][end],f[start][k]+f[k][end]);
f[start][end]+=ok[start][end];
}
printf("%d\n",f[1][n]);
}

整整写了一天啊……….

POJ 3178 凸包+DP (巨坑)的更多相关文章

  1. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  2. 【单页应用巨坑之History】细数History带给单页应用的噩梦

    前言 在我们日常的网页浏览中,我们非常喜欢做一个操作:点击浏览器的前进后退在Ajax技术出现后,有些时候前进后退就会给开发者带来困扰,甚至一些开发者试图去干掉History随着Html5的发展,移动端 ...

  3. bat调用bat的一个巨坑

    [一个巨坑] a.bat的内容:echo 1b.batecho 2执行结果:运行a.bat时,输出1,然后调用b.bat, 但是 echo 2 显示不出来. bat怎么调用bat文件并返回? 例如主文 ...

  4. QJsonObject和QJsonArray的巨坑

    最近用Qt的QJsonObject和QJsonArray当做类变量来存储运行信息,发现这两货真的是巨坑.让人有一种JJ fly的感觉/(ㄒoㄒ)/~~. 写了个例子来说明下: MainWindow:: ...

  5. poj 1873 凸包+枚举

    The Fortified Forest Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6198   Accepted: 1 ...

  6. poj 1113 凸包周长

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33888   Accepted: 11544 Descriptio ...

  7. better-scroll之吸顶效果巨坑挣扎中

    今天和大家分享下better-scroll这款移动端用来解决各种滚动需求的插件(目前已经支持PC) 关于其中的API大家可以去官网看下  这里就给大家介绍几种常用的以及需要注意的点是什么 首先说一下b ...

  8. (杭电 2054)A==B?(这真是个巨坑)

    A == B ? Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false

    根据When an overlay node with actions is copied there is currently a SpriteKit bug where the node’s is ...

随机推荐

  1. poj--3169--Layout(简单差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9098   Accepted: 4347 Descriptio ...

  2. hdoj--1248--寒冰王座(完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. vue-quill-editor 禁止编辑

    每天学习一点点,知识财富涨点点 因为权限问题需要对富文本vue-quill-editor进行禁止编辑,因为也不是专业前端,处理起问题来还是只有看文档和百度,发现对这个提问不是很多,可能很多大牛都不会出 ...

  4. 19. Remove Nth Node From End of List[M]删除链表的倒数第N个节点

    题目 Given a linked list, remove the n-th node from the end of list and return its head. *Example: Giv ...

  5. layer Tips参数使用

    layer.tips(content, follow, options) - tips层type:4的深度定制.也是我本人比较喜欢的一个层类型,因为它拥有和msg一样的低调和自觉,而且会智能定位,即灵 ...

  6. struts2学习之基础笔记5

    第十章 Struts 2的输入校验 1 Struts 2 输入校验原理 a . 分类 validate()方法校验 b . validation框架校验 2 valibate()方法校验实现 步骤  ...

  7. 深入了解React组件重新渲染的条件和生命周期

    React组件rerender的真正条件 当前组件的State中的属性改变时且当前组件的shouldcomponentupdate返回true,那么当前组件会rerender 组件的props中的任一 ...

  8. Android 多线程下载 显示进度 速度

    功能要求:从网络下载一APK应用,显示下载速度.进度,并安装应用. 运行效果图: 工程结构图: 很简单,就一个activity,一个更新UI的线程,一个下载线程加个文件处理类 主要代码: /** *多 ...

  9. 解决PL/SQL管理工具database下拉为空和登录出现ORA-12154

    前言:昨天捣鼓了一下午,终于可以用plsql连接上oracle了... 测试环境:win10 注意问题: (一).环境变量 我发现按网上别人说的那一大推环境配置,很容易出错,我把它们全删了,就留了两个 ...

  10. pythone 学习笔记(粗略)

    文档目录 概述 安装 基本语法 数据结构 4.1 数字和字符串类型 4.2 元祖 4.3 列表 4.4 字典 流程语句 5.1 分支结构 5.2 逻辑运算符(if) 5.3 循环 5.3.1 for ...