P1105 平台

这篇文章描述了一个C++程序,通过定义structTabel来存储平台信息,包括高度、左端点、右端点和答案。程序实现了两个排序函数pd和pd2,用于根据高度和id对平台进行排序。主要功能是找出每个平台左端点和右端点的第一个触碰平台ID。
摘要由CSDN通过智能技术生成

#include<bits/stdc++.h> 
using namespace std;

struct Tabel { //用来存储每个平台信息的struct
    int id, H, L, R; //id时编号,H, L, R分别为高度、左端点、右端点
    int ansL, ansR; //用来存储答案,分别为左端点第一个触碰到的、
                                    //右端点第一个触碰到的
};

inline bool pd(Tabel a, Tabel b) { //在sort排序时使用的pd函数
    if (a.H == b.H) { //假如高度相同(重复的)就使用编号排序
        if(a.id > b.id) {
            return false;
        } else {
            return true;
        }
    }
    return a.H > b.H; //当高度不相同时,采用高度排序
}

inline bool pd2(Tabel a, Tabel b) { //用于排序的pd2函数
    if(a.id > b.id) { //按照id排序
        return false;
    }
    return true;
}

int main(int argc, char** args) {
    int n = 0;
    struct Tabel t[1005];
    memset(t, 0, sizeof(t)); //将t全部初始化为0
    scanf("%d", &n);
    for(int i = 0;i < n;i++) {
        scanf("%d %d %d", &t[i].H, &t[i].L, &t[i].R);
        t[i].id = i + 1; //设置每一个平台的id,因为是从1开始的,所以加一
    }
    sort(t, t + n, pd); //按照高度或id排序
    for(int i = 0;i < n;i++) { //判断左端点的触碰,求出答案之一
        t[i].ansL = 0;
        for(int j = i;j < n;j++) {
            if(t[i].L > t[j].L && t[i].L < t[j].R) { //当左端点在某个平台内时(不包括两端)
                t[i].ansL = t[j].id; //记录触碰平台的id
                break; //这里只求第一个触碰到的,所以break
            }
        }
    }
    for(int i = 0;i < n;i++) { //判断右端点的触碰,求出答案,以下同上
        t[i].ansR = 0;
        for(int j = i;j < n;j++) {
            if(t[i].R < t[j].R && t[i].R > t[j].L) {
                t[i].ansR = t[j].id;
                break;
            }
        }
    }
    //这里将序列恢复成原来的样子是应为要按照id的顺序输出
    sort(t, t + n, pd2); //最终将序列恢复成原来的样子
    for(int i = 0;i < n;i++) {
        printf("%d %d\n", t[i].ansL, t[i].ansR); //输出
    } 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值