題意:
有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;
}