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 ...
随机推荐
- Elasticsearch-基础介绍及索引原理分析(转载)
最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearch的基础理论知识,整理了一下,希望能对Elastic ...
- Python 各种进制转换
#coding=gbk var=input("请输入十六进制数:") b=bin(int(var,16)) print(b[2:]) 详细请参考python自带int函数.bin函 ...
- 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。
一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...
- 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)
一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...
- 第一节:框架前期准备篇之Log4Net日志详解
一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库.t ...
- Mysql MGR架构误操作引发的问题处理
[背景介绍] 故障方描述:一次用户刷权限的时候不小心把数据库用户表记录删掉了,执行之后发现不对后重建用户,杀掉进程后重新MGR启动报错. [报错信息] 2018-06-13T12:47:41.4055 ...
- C#利用VUDP.cs开发网络通讯应用例程
VClassLib-CS项目Github地址:https://github.com/velscode/VClassLib-CS VUDP文档地址:https://github.com/velscode ...
- 在centos7下安装.net core
在这里记录下安装的过程: 一开始需要去官网下载centos相关的dotnetcore的sdk 上传到linux,解压,发现需要安装libunwind, 安装libunwind:yum install ...
- django drf 开发 ~ models基础学习
零 介绍 对于ORM框架,可以简单的认为自定义类U表示数据库的表:根据类创建的对象表示数据库表一 数据表设计 1 类型统计 CharField->(string)->(1 ma ...
- springboot集成mybatis源码分析(一)
本篇文章只是简单接受使用,具体源码解析请看后续文章 1.新建springboot项目,并导入mybatis的pom配置 配置数据库驱动和mybatis dependency <dependenc ...