bzoj1091: [SCOI2003]切割多边形

Description

  有一个凸p边形(p<=8),我们希望通过切割得到它。一开始的时候,你有一个n*m的矩形,即它的四角的坐标分
别为(0,0), (0,m), (n,0), (n,m)。每次你可以选择一条直线把当前图形切割成两部分,保留其中一个部分(另一
部分扔掉)切割线的长度为此直线在多边形内部的部分的长度。求出最短的切割线总长度。下面是一个例子。我们
需要得到中间的多边形。

  分别沿着直线1,2,3,4进行切割即可,得到中间的四边形。

Input

  第一行有两个整数n, m(0 < n,m < 500),第二行为一个整数p(3<=p<=8)。以下p行每行为两个整数x, y(0 < x
 < n, 0 < y < m),为按顺时针给出的各顶点坐标。数据保证多边形的是凸的,无三点共线。输入数据无错误。

Output

  仅一行,为最短切割线的总长度,四舍五入到小数点后3位。允许有0.001的误差。

枚举切割顺序,然后模拟加入直线,暴力计算与其余直线的交点

#include<cstdio>
#include<cmath>
#include<algorithm>
int n,id[11],lp=0;
double v1,v2,ans=1e10;
struct pos{
    double x,y;
    void init(){scanf("%lf%lf",&x,&y);}
    pos operator+(pos a){return (pos){x+a.x,y+a.y};}
    pos operator-(pos a){return (pos){x-a.x,y-a.y};}
    pos operator*(double a){return (pos){x*a,y*a};}
    double operator*(pos a){return x*a.y-y*a.x;}
    double dot(pos a){return x*a.x+y*a.y;}
    double abs(){return sqrt(x*x+y*y);}
}ps[11];
double mn,mx;
struct line{
    pos a,b;
    void chk(line w){
        double c=w.b*b;
        if(c==0)return;
        c=(a*w.b+w.b*w.a)/c;
        if(c>0.5)c<mx&&(mx=c);
        else c>mn&&(mn=c);
    }
}ls[15],l0[11];
int main(){
    scanf("%lf%lf%d",&v1,&v2,&n);
    for(int i=1;i<=n;++i)ps[i].init(),id[i]=i;
    ps[n+1]=ps[1];
    pos p1=(pos){0,0},p2=(pos){v1,0},p3=(pos){v1,v2},p4=(pos){0,v2};
    ls[lp++]=(line){p1,p2-p1};
    ls[lp++]=(line){p2,p3-p2};
    ls[lp++]=(line){p3,p4-p3};
    ls[lp++]=(line){p4,p1-p4};
    for(int i=1;i<=n;++i)l0[i]=(line){ps[i],ps[i+1]-ps[i]};
    do{
        lp=4;
        double s=0;
        for(int i=1;i<=n;++i){
            int w=id[i];
            mn=-1e10,mx=1e10;
            for(int j=0;j<lp;++j)l0[w].chk(ls[j]);
            ls[lp++]=l0[w];
            s+=(mx-mn)*l0[w].b.abs();
        }
        if(s<ans)ans=s;
    }while(std::next_permutation(id+1,id+n+1));
    printf("%.3f",ans);
    return 0;
}
时间: 2024-08-27 20:22:49

bzoj1091: [SCOI2003]切割多边形的相关文章

BZOJ 1091([SCOI2003]切割多边形-切割直线)

1091: [SCOI2003]切割多边形 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 223  Solved: 82 [Submit][Status] Description 有一个凸p边形(p<=8),我们希望通过切割得到它.一开始的时候,你有一个n*m的矩形,即它的四角的坐标分别为(0,0), (0,m), (n,0), (n,m).每次你可以选择一条直线把当前图形切割成两部分,保留其中一个部分(另一部分扔掉)切割线的长度为此直线在多边形

BZOJ 1091([SCOI2003]分割多边形-分割直线)

1091: [SCOI2003]分割多边形 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 223  Solved: 82 [Submit][Status] Description 有一个凸p边形(p<=8).我们希望通过分割得到它.一開始的时候,你有一个n*m的矩形,即它的四角的坐标分别为(0,0), (0,m), (n,0), (n,m).每次你能够选择一条直线把当前图形分割成两部分,保留当中一个部分(还有一部分扔掉)分割线的长度为此直线在多边

uva 11595 - Crossing Streets EXTREME(切割多边形)

题目链接:uva 11595 - Crossing Streets EXTREME 对初始平面进行切割,得到所有平面,然后处理出所有边,有公共边的两个平面之间可以到达,对于城市的权值可以加到点上,进出各加一次即可. #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <complex> #in

【BZOJ】【1091】【SCOI2003】切割多边形

计算几何+枚举 我比较傻逼……一开始想了个贪心,就是这样: 对于每个顶点,找到它的两条切割线……然后我们枚举第一刀是哪一条直线,剩下的p-2个顶点我们只要取两个方向中的较小值min(l[i],r[i])就可以了,枚举第一刀是为了防止风车型的出现…… 然而WA了= =突然想到有个反例…… 这种玩意你就不能砍了一刀后再取min了……因为其中一个方向可能会变短…… 所以还是只能枚举切割的顺序(反正只有p刀)然后模拟这个切割的过程……算长度…… Orz果然我还是太弱,这种东西写出来干嘛……(表示一下我一

切割多边形

Description 在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若干三角形.现在的任务是从键盘输入凸多边形的边数n,求不同剖分的方案数Cn. Analysis 困难的一题. 不谈1000的数据量加上大整数会不会TLE,先分析一下转移方程. 不妨以点为突破口.显而易见,每个点要么被连接,要么不被连接. 当不被连接时,其相邻两点一定连接,则n边形转化为n-1边形. 当被连接时,可以与n-3个点相连,那么相连之后分割出i边形和n-i+2边形.为了防止重复,即连接第i个点时要保证

任意多边形切割/裁剪(附C#代码实现)

本实现主要参考了发表于2003年<软件学报>的<一个有效的多边形裁剪算法>(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提取了论文中一些重要的理论加以汇总.另外对于论文描述无法处理的一些情况也进行了试探性的分析. 多边形裁剪用于裁剪掉被裁剪多边形(又称为实体多边形,后文用S表示)位于窗口(又称为裁剪多边形,后文用C表示)之外的部分.裁剪的结果多边形是由实体多边形位于裁剪多边形内的边界和裁剪多边形位于实体多边形内的边界组成的.见下

改革春风吹满地(多边形面积)

http://acm.hdu.edu.cn/showproblem.php?pid=2036 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22973    Accepted Submission(s): 11889 Problem Description “ 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分

poj3335 半交平面,多边形内核

Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5300   Accepted: 2112 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the ed

uva 12296(切割凸多边形)

题意:有一个长l宽w的矩形,左下角坐标是(0,0),现在有n条线段把这个矩形切割,保证每条线段的两个端点落在矩形不同的边上,把矩形分成了若干区域,现在有m个圆画进矩形,问圆覆盖了哪些区域,并把这些区域的面积排序输出. 题解:先要切割矩形,方法是每读入一条线段都拿去处理切割出的新的区域把原先的区域替换,最后可以得到一个区域的vector,然后判断圆和区域的情况: 1.如果圆没有公共点,可以是圆在某个区域内,或某些区域在圆内.这时需要判断多边形是否有顶点在圆内,或圆心是否在那个多边形内. 2.判断圆