冰壶(cmp比较器的使用)

4737. 冰壶 - AcWing题库

主要是举一个使用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;
}
  1. 读取一个整数T,表示测试用例的数量。
  2. 对于每个测试用例,首先读取两个整数Rs和Rh,然后读取一个整数n,表示点的数量。
  3. 对于每个点,读取其坐标x和y。如果该点在以(Rs, Rh)为圆心,半径为Rs+Rh的圆内(包括边界),则将该点加入数组arr,并标记其类型为1。
  4. 接着读取一个整数m,表示查询的数量。
  5. 对于每个查询,读取其坐标z和w。如果该查询点在以(Rs, Rh)为圆心,半径为Rs+Rh的圆内(包括边界),则将该查询点加入数组arr,并标记其类型为2。
  6. 然后根据点的距离进行排序。
  7. 遍历排序后的数组arr,分别计算类型为1的点和类型为2的查询点的数量。
  8. 输出每个测试用例中,类型为1的点的数量和类型为2的查询点的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值