wf 2017A
给一个多边形,问能放进去的最长的线段的长度。
我调了两个小时结果加了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的更多相关文章
- 转《WF编程》笔记目录
<WF编程>笔记目录 2008-03-18 09:33 by Windie Chai, 26803 阅读, 49 评论, 收藏, 编辑 WF笔记开始 <WF编程>系列之0 - ...
- wf(七)(手把手包会)
这个demo中我们将用If/Else逻辑加到工作流用来展示不同的message通过自定义的条件. 如果name的字符数是奇数,第一个单词就输出“Greeting”否则输出“Hello”. 1. 在Sa ...
- wf(五)
测试工作流: 运用wf(四)的solution: 创建单元测试项目: 1.选择HelloWorkflow解决方案,右键选择添加新建项目:选择单元测试模板,命名为HelloWorkflow.Tests. ...
- wf(四)
我们已经在c#和xaml上编写了工作流,或者有的人会觉得在xaml上编写的workflow没什么优点,然而其实xaml其实具有一些很特别的优势. 1. xaml支持工作流设计器,c#不支持: 2. x ...
- wf(三)
前言: 到现在我们可以看到,WF4包含一个.xmal 文件的设计器和一个调用活动的runtime.当你创建自己的工作流的时候,你是同时也创建了一个活动, 因为活动是一个继承System.Activit ...
- WF(二)
步骤一: 运用WF(一)中创建好的solution 重命名Workflow1.xaml,变为SayHello.xaml 并在属性窗口设置名称为HelloWorkflow.SayHello,如下图: ( ...
- [WF] Quickstart Sample
[WF] Quickstart Sample 前言 Workflow Foundation(WF),总是给人一种很有用.可是却不知道怎么用的印象.这主要是因为前置的功课太多.要整合很多底层知识,才能完 ...
- CS中调用微软自带com组件实现音频视频播放(wf/wpf)
1.mp3播放器:工具箱中右键,在弹出的菜单中选择“选择项”,添加“com组件”,选择名称“windows Media Player",点击确定就会在工具箱新增一个“windows Medi ...
- WF 快速入门
WF(Windows Workflow Foundation ,中文译为:Windows工作流基础)是一种基于更高级抽象概念的编程语言,适合于实现业务流程.虽然可以通过使用图形化的工具(Workflo ...
随机推荐
- 智联python 技能摘取
- rocketmq 4.2.0集群配置
采用的是2m-2s-async模式 1. 修改每台机器的/etc/hosts 文件,增加如下内容 192.168.1.100 nameserver1192.168.1.102 nameserver ...
- dos.orm
引言: Dos.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内用户量最大.最活跃.最完善的国产ORM.初期开发过程中参考了NBear与My ...
- C语言malloc函数为一维,二维,三维数组分配空间
c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...
- Java泛型用法总结
普通泛型 class Point< T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T ...
- jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年(最新亲测可用)
破解补丁激活 之前看了好多的其它的方法感觉都不是很靠谱还是这个本人亲试可以长期有效不仅能激活pycharm.jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年 ...
- php树形结构数组转化
/** * @param array $list 要转换的结果集 * @param string $pid parent标记字段 * @param string $level level标记字段 */ ...
- Web服务器原理
——————————什么是Web服务器 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.目前最主流的三个Web服务器是Apache Ngin ...
- 指针数组&数组指针
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数 ...
- C#实现短链接生成服务
项目中有一处需求,需要把长网址缩为短网址,把结果通过短信.微信等渠道推送给客户.刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一个别具特色的长网址(文本)缩短服务. 由于以前做 ...