PAT Advanced Level 1080. Graduate Admission (30)

【来源】

1080. Graduate Admission (30)

【分析】

暂略,有空来填坑。

【代码】

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

using namespace std;

struct Person
{
    int ge;
    int gi;
    int total;
    int* prefers;
    int id;
    int index;

    Person(int K){
        ge = 0;
        gi = 0;
        total = 0;
        prefers = new int[K];
        index = -1;
        id = -1;
    }
    //~Person(){
    //    delete[] prefers;
    //}
};

bool compare(Person p1, Person p2)
{
    if (p1.total != p2.total){
        return p1.total > p2.total;
    }
    else{
        return p1.ge > p2.ge;
    }
}

bool compareid(Person p1, Person p2)
{
    return p1.id < p2.id;
}

int main()
{
    int N, M, K;
    cin >> N >> M >> K;

    int* quotas = new int[M];
    for (int i = 0; i < M; ++i){
        cin >> quotas[i];
    }
    vector<Person> total;

    vector<Person> * admits = new vector<Person>[M];
    for (int i = 0; i < N; ++i){
        Person p(K);
        cin >> p.ge >> p.gi;
        for (int j = 0; j < K; ++j){
            cin >> p.prefers[j];
        }
        p.total = p.ge + p.gi;
        p.id = i;
        total.push_back(p);
    }
   
    sort(total.begin(), total.end(), compare);
    total[0].index = 0;
    for (int j = 1; j < total.size(); ++j){
        total[j].index = j;
        if ((total[j].total == total[j - 1].total) 
            && (total[j].ge == total[j-1].ge)){
            total[j].index = total[j - 1].index;
        }
    }

    for (int i = 0; i < N; ++i){
        // for each student from top to down
        for (int j = 0; j < K; ++j){
            // for each graduate school
            int size = admits[total[i].prefers[j]].size();
            bool notFull = size < quotas[total[i].prefers[j]];
            Person last(K);
            if (size > 0){
                last = *admits[total[i].prefers[j]].rbegin();
            }
            bool tie = ((last.index == total[i].index) && !notFull);
            if (notFull || tie){
                admits[total[i].prefers[j]].push_back(total[i]);
                break;
            }
        }
    }
    for (int i = 0; i < M; ++i){
        sort(admits[i].begin(), admits[i].end(), compareid);
        if (admits[i].size() >= 1){
            cout << admits[i][0].id;
            for (int j = 1; j < admits[i].size(); ++j){
                cout << " " << admits[i][j].id;
            }
        }
        cout << endl;
    }


    delete[] quotas;
    delete[] admits;

    system("pause");
    return 0;
}

【点评】

本题也是2014年浙大研究生入学上机考试的最后一题,是取材自现实生活的模拟题。并没有涉及到高深的数据结构和算法,所以题目不算很难,只要思路清晰,仔细阅读题目给出的条件,还是可以一遍AC的。


select * from ( SELECT P.PATIENT_ID, P.VISIT_ID, PM.NAME, PM.SEX, P.ADMISSION_DATE_TIME, ( SELECT TOP 1 DP.DEPT_NAME FROM DEPT_DICT DP WHERE DP.DEPT_CODE = P.DEPT_ADMISSION_TO ) AS DEPT_ADM, P.DISCHARGE_DATE_TIME, ( SELECT TOP 1 DP.DEPT_NAME FROM DEPT_DICT DP WHERE DP.DEPT_CODE = P.DEPT_DISCHARGE_FROM ) AS DEPT_DIS, DATEDIFF( DAY, P.ADMISSION_DATE_TIME, P.DISCHARGE_DATE_TIME ) AS INPAT_DAYS, P.DOCTOR_IN_CHARGE --datediff(day, P.ADMISSION_DATE_TIME,P.DISCHARGE_DATE_TIME) as zyts FROM PAT_VISIT P INNER JOIN PAT_MASTER_INDEX PM ON PM.PATIENT_ID = P.PATIENT_ID WHERE select * from ( SELECT P.PATIENT_ID, P.VISIT_ID, PM.NAME, PM.SEX, P.ADMISSION_DATE_TIME, ( SELECT TOP 1 DP.DEPT_NAME FROM DEPT_DICT DP WHERE DP.DEPT_CODE = P.DEPT_ADMISSION_TO ) AS DEPT_ADM, P.DISCHARGE_DATE_TIME, ( SELECT TOP 1 DP.DEPT_NAME FROM DEPT_DICT DP WHERE DP.DEPT_CODE = P.DEPT_DISCHARGE_FROM ) AS DEPT_DIS, DATEDIFF( DAY, P.ADMISSION_DATE_TIME, P.DISCHARGE_DATE_TIME ) AS INPAT_DAYS, P.DOCTOR_IN_CHARGE --datediff(day, P.ADMISSION_DATE_TIME,P.DISCHARGE_DATE_TIME) as zyts FROM PAT_VISIT P INNER JOIN PAT_MASTER_INDEX PM ON PM.PATIENT_ID = P.PATIENT_ID WHERE P.DISCHARGE_DATE_TIME >= '2016-01-01' AND P.DISCHARGE_DATE_TIME < = '2023-07-10' AND DATEDIFF( DAY,P.ADMISSION_DATE_TIME, P.DISCHARGE_DATE_TIME ) >= 30 ) t order by inpat_days desc P.DISCHARGE_DATE_TIME >= '2016-01-01' AND P.DISCHARGE_DATE_TIME < = '2023-07-10' AND DATEDIFF( DAY,P.ADMISSION_DATE_TIME, P.DISCHARGE_DATE_TIME ) >= 30 ) t order by inpat_days desc 帮我把这段sql优化一下
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值