Sicily 1063. Who's the Boss

本文介绍了一种通过排序和结构化数据来优化员工层级关系计算及查询效率的算法实现。通过对员工的薪资进行排序,并利用结构体记录每个员工的上司编号和下属数量,实现了快速查询特定员工的上司和下属数量的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
全部雇员都计算一遍之后在进行query,应该有更快的方法吧 
*/
/*
Run Time: 0.7secs
Run Memory: 20812KB
*/

#include <iostream>
#include <algorithm>
#include <vector>


using namespace std;

typedef struct Emp{
    int id;            //员工id,六位,唯一 
    int salary;        //收入,最高10,000,000,唯一 
    int tall;          //身高,1,000,000到2,500,000,可重复 
    int boss;          //记录当前员工的boss号
    int subCount;      //记录当前员工的部下数量 
}; 

int n;    //case数
int m;    //员工数,最多30000 
int q;    //query数,最多200 

Emp dataID[1000001];  //雇员纪录,按照ID排放
vector<Emp> dataSal;  //雇员记录,按照Salary排放 
int queries[202];    //记录query

//按照Salary的排序因子 
int cmpSalary(Emp a, Emp b){
    return a.salary < b.salary;
} 



void comput(){
    sort(dataSal.begin(), dataSal.end(), cmpSalary);
    
    //为每一个雇员计算其boss号以及部下数量,计算完一个人就把它放入数组 
    for(int i=0; i<m; i++){
        for(int j=i+1; j<m; j++){
            if(dataSal[i].tall <= dataSal[j].tall){
                dataSal[i].boss = dataSal[j].id;
                dataSal[j].subCount += dataSal[i].subCount + 1;
                break;
            } 
        }
        dataID[dataSal[i].id] = dataSal[i];
    }
    
    //开始执行query 
    for(int i=0; i<q; i++){
        cout << dataID[queries[i]].boss << " " << dataID[queries[i]].subCount << endl;
    } 
}

int main()
{
    cin >> n;
    while (n-->0){
        cin >> m >> q;
        dataSal.clear(); 

        for(int i=0; i<m; i++){
            Emp buf;
            cin >> buf.id >> buf.salary >> buf.tall;
            buf.boss = buf.subCount = 0; 
            dataSal.push_back(buf); 
        }

        for(int i=0; i<q; i++)
            cin >> queries[i];

        comput();
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值