河南理工大学算法协会暑期集训积分(二) D. Points in rectangle(数学,几何)

题目链接:https://hpuoj.com/contest/23/problem/D/

题意:

给出四个点组成的矩形,在给出很多点,问有多少个点在矩形内(边上也算)

分析:

这题,唉,一言难尽。首先看到题,然后看到了四个点 (0,a),(a,0),(n,n−a),(n−a,n),然后就随便在纸上画了一下,我以为是这样的?

其实,它是这样的

因为错误的想法,我先考虑斜率,有考虑点到支线的距离,结果已知错错错

正解是求出四条直线的直线方程,然后把点带入直线,然后比较实际的y值与带入直线求出的y值即可。

#include <bits/stdc++.h>

using namespace std;
const int N = 1010;

typedef pair<int, int> P;
vector<P> v1, v2;

bool cmp(P p1, P p2)
{
    if(p1.first == p2.first)
        return p1.second > p2.second;
    return p1.first > p2.first;
}

 double ffabs(double num)   // 自己定义返回double类型的绝对值函数
 {
    if(num < 0)
        return -num;
    return num;
 }

int main()
{
    int n, a;
    while(scanf("%d %d", &n, &a) != EOF)
    {
        v1.clear();
        v2.clear();
        int m;
        int x, y;
        scanf("%d", &m);
        for(int i=0; i<m; i++)
        {
            scanf("%d %d", &x, &y);
            v1.push_back(P(x, y));
        }

        // double d1 = sqrt(pow(1.0 * (n-a), 2) + pow(1.0 * (n-a), 2));
        // double d2 = sqrt(pow(1.0 * a, 2) + pow(1.0 * a, 2));
        // printf("d1 = %lf  d2 = %lf\n", d1, d2);

        for(int i=0; i<m; i++)
        {
            // double dis1 = ffabs(1.0 * v1[i].first - v1[i].second - a) / sqrt(2.0);
            // double dis2 = ffabs(1.0 * v1[i].first + v1[i].second - 2*n + a) / sqrt(2.0);
            // double dis3 = ffabs(1.0 * v1[i].first - v1[i].second + a) / sqrt(2.0);
            // double dis4 = ffabs(1.0 * v1[i].first + v1[i].second - a) / sqrt(2.0);
            // if(dis1 + dis3 <= d2 && dis2 + dis4 <= d1)
            // {
            //     v2.push_back(v1[i]);
            // }

            if(v1[i].second >= v1[i].first - a && v1[i].second <= -v1[i].first + 2*n - a && v1[i].second <= v1[i].first + a && v1[i].second >= -v1[i].first + a)
            {
                v2.push_back(v1[i]);
            }

        }

        sort(v2.begin(), v2.end(), cmp);
        if(v2.empty())
            printf("-1\n");
        else
        {
            printf("%d\n", v2.size());
            int len = v2.size();
            for(int i=0; i<len; i++)
            {
                printf("%d %d\n", v2[i].first, v2[i].second);
            }
        }
        

    }


    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java.awt.Rectangle是Java编程语言中的一个类,用于表示一个矩形的位置和大小。它包含了四个整数类型的变量,分别表示矩形的左上角的x坐标、y坐标,以及矩形的宽度和高度。这个类提供了一些方法,可以用来操作矩形,比如判断两个矩形是否相交、获取矩形的面积等。在Java图形界面编程中,java.awt.Rectangle类经常被用来表示组件的位置和大小。 ### 回答2: java.awt.Rectangle是Java语言中的一个类,用于表示一个矩形对象。 Rectangle类位于java.awt包,并且是一个抽象类。它提供了一系列方法用于对矩形进行操作,例如增加、减少矩形的大小,判断两个矩形是否相交等。 Rectangle类有四个主要的属性:x,y,width和height。x和y表示矩形的左上角坐标,而width和height表示矩形的宽度和高度。 Rectangle类提供了许多方法来操作这些属性。例如,可以使用setLocation方法来设置矩形的左上角坐标,使用setSize方法来设置矩形的大小,使用contains方法来判断一个点是否在矩形内部等。此外,还可以使用intersect方法来判断两个矩形是否相交,使用union方法来获取包含两个矩形的最小矩形等。 Rectangle类还提供了一些其他的方法来处理矩形。例如,可以使用translate方法来平移矩形,使用grow方法来扩大或缩小矩形的大小等。 总之,java.awt.Rectangle类是Java语言中用于表示矩形的一个类。它提供了一系列方法来操作矩形的属性,以及处理矩形的各种操作。通过使用Rectangle类,我们可以方便地对矩形进行操作和处理。 ### 回答3: java.awt.Rectangle是Java编程语言中的一个类,用于表示一个矩形的几何形状。它包含了矩形的位置和大小信息,可以用来进行矩形的操作和计算。 Rectangle类提供了一系列方法,用于获取和设置矩形的坐标、宽度和高度。它还可以用于判断两个矩形之间的关系,比如判断是否相交、包含等。另外,Rectangle还提供了一些常用的方法,比如计算矩形的面积和周长,判断点是否在矩形内部等。 Rectangle类可以在图形界面编程中用于绘制和操作矩形。通过设置Rectangle对象的属性,可以控制矩形的位置和大小,从而实现矩形的显示和交互效果。在页面布局中,Rectangle可以用来计算和调整组件的位置和大小,从而实现自适应和响应式的布局效果。 此外,Rectangle类还可以与其他图形对象进行组合和操作。比如,可以通过Rectangle类的方法来计算两个矩形的并集、交集等。同时,还可以通过Rectangle的方法来判断一个点是否在某个矩形内部,或者判断一个矩形是否与另一个图形对象相交等。 总之,java.awt.Rectangle是一个非常常用的图形类,可以方便地表示和操作矩形形状。它提供了丰富的方法,可以满足各种矩形操作的需求,并且可以与其他图形对象进行组合和处理,具有很大的灵活性和应用价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值