CCF 202009-1 称检测点查询
思路
给定一个点坐标x,y,求距离给定的N个点坐标最近的前三个点的编号,若距离相同则取编号最小的。排序问题,即将N个点和目标点(x,y)所有距离存储后,有小到大进行排序,输出前三个点。
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 201;
int n, X, Y;
struct Point
{
int x, y, d;
int id;
bool operator< (const Point& t) const
{
if (d != t.d) return d < t.d;
return id < t.id;
}
}q[N];
int get_dist(int x1, int y1, int x2, int y2)
{
int dx = x1 - x2;
int dy = y1 - y2;
return dx * dx + dy * dy;
}
int main()
{
cin >> n >> X >> Y;
for (int i = 0; i < n; i++)
{
int x, y;
cin >> x >> y;
q[i] = { x, y, get_dist(X, Y, x, y), i + 1 };
}
sort(q, q + n);
for (int i = 0; i < 3; i++) cout << q[i].id << endl;
return 0;
}
CCF 202009-2 风险人群筛查
思路
给定一个矩形区域(高风险区),给定N个人T个时刻经过的位置坐标,统计其中多少人曾经到过高风险区(只出现一次或小于k次),多少人曾经逗留过高风险区(位置坐标连续K个出现在矩形区域内)
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
int n, k, t, x1, y1, x2, y2;
int main()
{
cin >> n >> k >> t >> x1 >> y1 >> x2 >> y2;
int res1 = 0, res2 = 0;
while (n--)
{
bool r1 = false, r2 = false;
int s = 0;
for (int i = 0; i < t; i++)
{
int x, y;
cin >> x >> y;
if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
{
s++;
r1 = true;
if (s >= k) r2 = true;
}
else s = 0;
}
if (r1) res1++;
if (r2) res2++;
}
cout << res1 << endl << res2 << endl;
return 0;
}
没有一个冬天不可逾越
没有一个春天不可到来
我们终将战胜疫情!
愿山河无恙,人间皆安!
长安常安!
西安加油!
愿来日可期
仍有秦扫六国之风范
大唐盛世之美艳!
愿我们美丽的十三朝古都西安早日康复!
|