广场舞 蓝桥真题

https://www.dotcpp.com/oj/problem1838.html

50%数据参考博客https://blog.csdn.net/qq_39562286/article/details/80033097

很多博客的思路都是 枚举每个小正方形的右上角 然后判断其余三个角是不是在多边形内 但是当出现斜率不存在的直线时就不好使了 比如下面这个样例

6
0 0
2 0
2 3
1 3
1 1
0 3

本应输出4 按上述方法却得6 所以除非保证所有直线斜率全都存在 否则不可行

 

正解就很巧妙得避开这个问题 对每一列正方形(假设只有连续的一段)一定有两条直线封住上下底 n^2的暴力枚举即可

还有就是ceil与floor的使用 mark

 

 

#include <bits/stdc++.h>
using namespace std;
const double N=1000000000000000000.0;
const int maxn=1e3+10;

struct node1
{
    int x,y;
};

struct node2
{
    node1 p1,p2;
};

struct node3
{
    double yl,yr;
};

node1 point[maxn];
node2 line[maxn];
node3 pre[maxn];
int n;

double gety(double x,node2 l)
{
    double y,x1,y1,x2,y2;
    x1=l.p1.x,y1=l.p1.y,x2=l.p2.x,y2=l.p2.y;
    y=(y2-y1)*(x-x1)/(x2-x1)+y1;
    return y;
}

bool cmp(node3 n1,node3 n2)
{
    return n1.yl<n2.yl;
}

int solve()
{
    int res,cnt,minn,maxx,l,r,i,j;
    minn=1000,maxx=-1000;
    for(i=0;i<n;i++){
        minn=min(minn,point[i].x),maxx=max(maxx,point[i].x);
    }
    res=0;
    for(i=minn+1;i<=maxx;i++){
        cnt=0;
        for(j=0;j<n;j++){
            l=line[j].p1.x,r=line[j].p2.x;
            if(l<=i-1&&i<=r){
                pre[cnt].yl=gety(i-1,line[j]),pre[cnt].yr=gety(i,line[j]);
                cnt++;
            }
        }
        sort(pre,pre+cnt,cmp);
        for(j=0;j<cnt/2;j++){
            l=int(ceil(max(pre[2*j].yl,pre[2*j].yr)));
            r=int(floor(min(pre[2*j+1].yl,pre[2*j+1].yr)));
            if(l<r) res+=(r-l);
        }
    }
    return res;
}

int main()
{
    int i,ans;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d",&point[i].x,&point[i].y);
    }
    for(i=0;i<n;i++){
        line[i].p1=point[i],line[i].p2=point[(i+1)%n];
        if(line[i].p1.x>line[i].p2.x){
            swap(line[i].p1,line[i].p2);
        }
    }
    printf("%d\n",solve());
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值