题目链接: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;
}