主要是举一个使用sort函数比较器的方法(比较结构体的方法)。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=25;
int n,m,Rs,Rh;
struct Node {
int x,y,a;
} arr[N];
LL getD(int a,int b) {
return LL((LL)a*(LL)a+(LL)b*(LL)b);
}
bool cmp(Node a,Node b) {
return getD(a.x,a.y)<getD(b.x,b.y);
}
int main(void) {
int T;
scanf("%d",&T);
for(int Case=1; Case<=T; Case++) {
scanf("%d%d",&Rs,&Rh);
scanf("%d",&n);
int x,y;
int top=0;
memset(arr,0,sizeof(arr));
for(int i=1; i<=n; i++) {
scanf("%d%d",&x,&y);
if((Rs+Rh)*(Rs+Rh)>=getD(x,y)) {
arr[++top]= {x,y,1};
}
}
scanf("%d",&m);
int z,w;
for(int i=1; i<=m; i++) {
scanf("%d%d",&z,&w);
if((Rs+Rh)*(Rs+Rh)>=getD(z,w)) {
arr[++top]= {z,w,2};
}
}
sort(arr+1,arr+top+1,cmp);
int red=0,yellow=0,cur=1;
while(arr[cur].a==1) {
red++;
cur++;
}
cur=1;
while(arr[cur].a==2) {
yellow++;
cur++;
}
printf("Case #%d: %d %d\n",Case,red,yellow);
}
return 0;
}
- 读取一个整数T,表示测试用例的数量。
- 对于每个测试用例,首先读取两个整数Rs和Rh,然后读取一个整数n,表示点的数量。
- 对于每个点,读取其坐标x和y。如果该点在以(Rs, Rh)为圆心,半径为Rs+Rh的圆内(包括边界),则将该点加入数组arr,并标记其类型为1。
- 接着读取一个整数m,表示查询的数量。
- 对于每个查询,读取其坐标z和w。如果该查询点在以(Rs, Rh)为圆心,半径为Rs+Rh的圆内(包括边界),则将该查询点加入数组arr,并标记其类型为2。
- 然后根据点的距离进行排序。
- 遍历排序后的数组arr,分别计算类型为1的点和类型为2的查询点的数量。
- 输出每个测试用例中,类型为1的点的数量和类型为2的查询点的数量。