给一个多边形,问能放进去的最长的线段的长度。

我调了两个小时结果加了inline就过???什么东西啊。2000+MS->890MS

真实自闭啊。

dls寒假已经讲的很清楚了(别问我为什么现在才做)

就是枚举所有点对然后  求出来这条直线 与多边形所有点的 交点,然后遍历这些交点,相当于进行一个最大字段和的操作。

如何check线段是不是在内部的话取线段中点就可以

调了一晚上简直自闭了,我寻思我剪枝还比别人多,做法一样的怎么我就过不去呢??

感觉把campdiv2消化干净的话可以get到超级多的新姿势呢

 #include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef double db;
const db eps = 1e-;
const db pi = acos(-);
inline int sign(db k){
if (k>eps) return ; else if (k<-eps) return -; return ;
}
inline int cmp(db k1,db k2){return sign(k1-k2);}
inline int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=;}// k3 在 [k1,k2] 内
struct point{
db x,y;
point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
point operator * (db k1) const{return (point){x*k1,y*k1};}
point operator / (db k1) const{return (point){x/k1,y/k1};}
int operator == (const point &k1) const{return cmp(x,k1.x)==&&cmp(y,k1.y)==;}
bool operator<(const point &k1)const {
int c = cmp(x,k1.x);
if(c)return c==-;
return cmp(y,k1.y)==-;
}
inline db abs(){ return sqrt(x*x+y*y);}
inline db abs2(){return x*x+y*y;}
inline db dis(point k1){return (*this-k1).abs();}
int getP() const{return sign(y)==||(sign(y)==&&sign(x)==-);}
};
inline db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
inline db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;}
inline int inmid(point k1,point k2,point k3){return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);}
inline int onS(point k1,point k2,point q){return inmid(k1,k2,q)&&sign(cross(k1-q,k2-k1))==;}
point proj(point k1,point k2,point q){
point k=k2-k1;return k1+k*(dot(q-k1,k)/k.abs2());
}
inline int checkLL(point k1,point k2,point k3,point k4){//判重合或者平行
return cmp(cross(k3-k1,k4-k1),cross(k3-k2,k4-k2))!=;
}
point getLL(point k1,point k2,point k3,point k4){
db w1 = cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3);
return (k1*w2+k2*w1)/(w1+w2);
}
int n;point p[];
inline int contain(point q){ // 2 内部 1 边界 0 外部
int pd=;
for (int i=;i<=n;i++){
point u=p[i-],v=p[i];
if (onS(u,v,q)) return ; if (cmp(u.y,v.y)>) swap(u,v);
if (cmp(u.y,q.y)>=||cmp(v.y,q.y)<) continue;
if (sign(cross(u-v,q-v))<) pd^=;
}
return pd<<;
}
db ans=;
inline void slove(point x,point y){
vector<point> v;
for(int i=;i<n;i++){
if(sign(cross(y-x,p[i]-x)*cross(y-x,p[i+]-x))<= ){
point v1 = y-x,v2=p[i+]-p[i];
if(sign(cross(v1,v2)) == ){
v.push_back(p[i]);
v.push_back(p[i+]);
}
else v.push_back(getLL(x,y,p[i],p[i+]));
}
}
sort(v.begin(),v.end());
v.resize(unique(v.begin(),v.end())-v.begin());
db tmp=;int m = v.size()-;
for(int i=;i<m;i++){
point mid = (v[i]+v[i+])/;
if(contain(mid)){
tmp+=v[i+].dis(v[i]);
}else{
ans = max(ans,tmp);
tmp = ;
if(v[i+].dis(v[m])<=ans)
return;
}
}
ans = max(ans,tmp);
}
int main(){
//freopen("secret-046.in","r",stdin);
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
p[n]=p[];
for(int i=;i<n-;i++){
for(int j=i+;j<n;j++){
slove(p[i],p[j]);
}
}
printf("%.9f\n",ans);
}
/**
5
2 0
2 3
1 1
0 2
0 0
*/

wf 2017A的更多相关文章

  1. 转《WF编程》笔记目录

    <WF编程>笔记目录 2008-03-18 09:33 by Windie Chai, 26803 阅读, 49 评论, 收藏, 编辑 WF笔记开始 <WF编程>系列之0 - ...

  2. wf(七)(手把手包会)

    这个demo中我们将用If/Else逻辑加到工作流用来展示不同的message通过自定义的条件. 如果name的字符数是奇数,第一个单词就输出“Greeting”否则输出“Hello”. 1. 在Sa ...

  3. wf(五)

    测试工作流: 运用wf(四)的solution: 创建单元测试项目: 1.选择HelloWorkflow解决方案,右键选择添加新建项目:选择单元测试模板,命名为HelloWorkflow.Tests. ...

  4. wf(四)

    我们已经在c#和xaml上编写了工作流,或者有的人会觉得在xaml上编写的workflow没什么优点,然而其实xaml其实具有一些很特别的优势. 1. xaml支持工作流设计器,c#不支持: 2. x ...

  5. wf(三)

    前言: 到现在我们可以看到,WF4包含一个.xmal 文件的设计器和一个调用活动的runtime.当你创建自己的工作流的时候,你是同时也创建了一个活动, 因为活动是一个继承System.Activit ...

  6. WF(二)

    步骤一: 运用WF(一)中创建好的solution 重命名Workflow1.xaml,变为SayHello.xaml 并在属性窗口设置名称为HelloWorkflow.SayHello,如下图: ( ...

  7. [WF] Quickstart Sample

    [WF] Quickstart Sample 前言 Workflow Foundation(WF),总是给人一种很有用.可是却不知道怎么用的印象.这主要是因为前置的功课太多.要整合很多底层知识,才能完 ...

  8. CS中调用微软自带com组件实现音频视频播放(wf/wpf)

    1.mp3播放器:工具箱中右键,在弹出的菜单中选择“选择项”,添加“com组件”,选择名称“windows Media Player",点击确定就会在工具箱新增一个“windows Medi ...

  9. WF 快速入门

    WF(Windows Workflow Foundation ,中文译为:Windows工作流基础)是一种基于更高级抽象概念的编程语言,适合于实现业务流程.虽然可以通过使用图形化的工具(Workflo ...

随机推荐

  1. Python系列之 - 前端总结

    1. python序列化: 字符串 = json.dumps(对象) 对象->字符串 对象 = json.loads(字符串) 字符串->对象 Javascript: 字符串 = JSON ...

  2. JDBC事务管理

    JDBC事务管理 概念回顾: 事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,那么这个业务操作的多个步骤要么同时失败,要么同时成功 事务操作: 开启事务 提交事务 回滚事务 使用Conn ...

  3. SpringBatch框架简介

    概观 轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序. Spring Batch提供了可重复使用的功能,这些功能对于处理大量记录至关重要,包括记录/跟踪,事务管理,作 ...

  4. 对OAuth协议的认识

    一. OAuth是什么 OAuth 是Open Authorization的简写.OAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准. 通俗地说,就是当我们想把自己系统的某些功能暴露 ...

  5. C# 对MongoDB 进行增删改查的简单操作

    C# 对MongoDB 进行增删改查的简单操作   下面演示下C#操作MongoDB驱动的简单的增删改查代码 运用到的MongoDB支持的C#驱动,当前版本为1.6.0 1,连接数据库   /// & ...

  6. Django Tastypie: 贴士,技巧和故障排除

    为Resource加入字段 1.为字段实现专门的dehydrate函数 2.实现(resource级别的)dehydrate方法 3.额外的方法 排除故障 通过外键,外键的反向关系来映射一个对象的属性 ...

  7. 第六章 使用 Bootstrap Typeahead 组件(百度下拉效果)(续)

    官方:http://twitter.github.io/typeahead.js/ 示例:http://twitter.github.io/typeahead.js/examples/(本文展示:Op ...

  8. Lua中的语句

    [赋值] 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许“多重赋值”,也就是一下子将多个值赋予多个变量,例如以下代码: , pr ...

  9. 阿里云ECS试用配置

    1.首先从阿里云找到ECS购买入口(目前在弹性入口的弹出框中).进入ECS购买界面后,选择免费试用. 此处省略试用申请过程. 2.然后再到云市场中购买一个免费的镜像服务.此处为Centos 64位系统 ...

  10. ubuntu 16.04 安装 kubelet、kubeadm 和 kubectl

    解决了***之后,就开始K8S安装的正式旅程,本次记录  kubelet.kubeadm 和 kubectl 的安装: apt-get update && apt-get instal ...