Gym101606E Education

題目鏈接

題意:
有n個系要搬家(系的屬性:人數;人數是一個整體,不可分割,本系的不能夠和別的系共享一個建築),有m個建築可以選擇(建築的屬性:可容納的人數;一年的租金),讓我們選擇花費最少的租房方案:依次輸出對應的系(從第1個系開始)選擇了哪個建築(編號從1開始)。
如果租不到合適的房子(住不下),輸出”impossible”。若有多種情況滿足條件,輸出任意一種。

做法:
貪心,讓人數最多的系優先選擇價格最低的建築。

反省:
1.不能用map映射房子的容量<–>房子的編號,房子的容量可以相同。
2.系人數sort(),題目也沒有說就是按升序排列的。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define MIN 0x3f3f3f3f

typedef
struct {  // 建築
    int num;  // 容量
    int price;  // 價格
    int id;  // 編號
}House;

typedef
struct {  // 系
    int pep;  // 人數
    int id;  // 編號
    int ans;  // 選擇的建築的編號
}Depart;

House a[5005];
Depart b[5005];
int f[5005];  // 標記建築是否被選擇

bool  // 建築按價格升序排列
cmp(House a, House b) {
    return a.price < b.price;
}

bool  // 系按人數降序排列
cmpa(Depart a, Depart b) {
    return a.pep > b.pep;
}

bool  // 系按編號升序排列
cmpb(Depart a, Depart b) {
    return a.id < b.id;
}

int
main() {
    int n, m, i, j, flag, cmin, noans;

    while( scanf("%d %d", &n, &m) != EOF ) {
        for( i = 0; i < n; i++ ) {
            scanf("%d", &b[i].pep);
            b[i].id = i;
        }
        for( i = 0; i < m; i++ ) {
            scanf("%d", &a[i].num);
            a[i].id = i + 1;
        }
        for( i = 0; i < m; i++ ) {
            scanf("%d", &a[i].price);
        }
        sort(b, b + n, cmpa);
        sort(a, a + m, cmp);

        memset(f, 0, sizeof(f));  //
        for( i = 0; i < n; i++ ) {  // 人數最多的系優先選擇價格最低的建築
            flag = -1;
            cmin = MIN;
            for( j = 0; j < m; j++ ) {
                if( a[j].num >= b[i].pep && a[j].price < cmin && f[a[j].id] == 0 ) {
                    // 住得下,價格更低,沒有被選,選擇
                    cmin = a[j].price;
                    flag = a[j].id;
                }
            }
            b[i].ans = flag;
            if( flag != -1 ) {  //
                f[flag] = 1;
            }
        }
        noans = 0;
        for( i = 0; i < n; i++ ) {
            if( b[i].ans == -1 ) {  // 沒有選到合適的建築標記爲-1
                noans = 1;
                break;
            }
        }
        if( noans == 1 ) {
            printf("impossible");
        }
        else {
            sort(b, b + n, cmpb);

            for( i = 0; i < n; i++ ) {
                if( i != 0 ) {
                    printf(" ");
                }
                printf("%d", b[i].ans);
            }
        }
        printf("\n");
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章