2020-09

称检测点查询

传送门

题意:找到离x,y最近的三个点

存所有的点到目标点的距离和id,将其按dis距离排序,输出前三个点的id标号。

#include<bits/stdc++.h> 
using namespace std;
struct node{
	double dis;
	int id;
}s[100010];
int x,y;
double cal(int a,int b)//计算距离
{
	return sqrt(pow(a-x,2)+pow(b-y,2)*1.0);
}
bool cmp(node a,node b)//排序cmp函数
{
	return a.dis<b.dis||(a.dis==b.dis&&a.id<b.id);
}
int main()
{
	int n,cnt=0;cin>>n>>x>>y;
	for(int i=1;i<=n;i++){
		int a,b;cin>>a>>b;
		s[++cnt].id=i;
		s[cnt].dis=cal(a,b);
	}
	sort(s+1,s+1+n,cmp);
	for(int i=1;i<=3;i++) cout<<s[i].id<<endl;
}

风险人群筛查

传送门

题意:统计逗留和经过的人数。

判断是否在区域内

bool check(int x,int y){
	if(x>=xl&&x<=xr&&y<=yu&&y>=yd)
	return 1;
	return 0;
}

若当前点在区域内,cnt++表示连续cnt个点都在区域内。

if(check(x,y))
{
    mark1=1;
    cnt++;
    if(cnt>=k) mark2=1;
}else cnt=0;
#include<bits/stdc++.h>
using namespace std;
int n,k,t,xl,yd,xr,yu;
bool check(int x,int y){
	if(x>=xl&&x<=xr&&y<=yu&&y>=yd)
	return 1;
	return 0;
}
int main()
{
	cin>>n>>k>>t>>xl>>yd>>xr>>yu;
	int jing=0,liu=0;
	while(n--)
	{
        // mark1:此人是否经过
        // mark2:此人是否逗留
        // cnt:连续cnt次经过区域内
		int mark1=0,mark2=0,cnt=0;
		for(int i=1;i<=t;i++)
		{
			int x,y;cin>>x>>y;
			if(check(x,y))
			{
				mark1=1;
				cnt++;
				if(cnt>=k) mark2=1;
			}else cnt=0;
		}
		if(mark2) liu++;
		if(mark1) jing++; 
	}
	cout<<jing<<endl<<liu<<endl;
}
原文地址:https://www.cnblogs.com/Calculus9/p/14436826.html