/*
贪心算法:
新进入的车厢记为n,已使用轨道的最后一节车厢记为m1、m2、m3……
在m1、m2、m3……中找到小于n且最大的m,将n加入到其后。
若不存在符合条件的m,则将n加入到新的轨道中。
其中输入序列、轨道、每节车厢进入的轨道序号 均可用数组实现。
*/
#include<cstdio>
#include<cstdlib>
#include<utility>
using namespace std;
#define N_MAX 200000
#define M_MAX 200000
int N, M;
pair<int, int> record[N_MAX];
int track[M_MAX];
int cnt;
int cmp(const void *p1, const void *p2) {
return ((pair<int,int>*)p1)->first - ((pair<int,int>*)p2)->first;
}
int main() {
while (scanf("%d%d", &N, &M)) {
if (N == 0 && M == 0) break;
for (int i = 0; i < N; i++) scanf("%d", &record[i].first);
cnt = 0;
int max_num, pos;
bool add_new_track;
for (int i = 0; i < N; i++) {
add_new_track = true;
max_num = 0;
for (int j = 0; j < cnt; j++) {
if (record[i].first >= track[j]) {
add_new_track = false;
if (track[j] > max_num) {
max_num = track[j];
pos = j;
}
}
}
if (add_new_track) {
track[cnt++] = record[i].first;
record[i].second = cnt;
}
else {
track[pos] = record[i].first;
record[i].second = pos + 1;
}
}
if (cnt > M) {
printf("Transportation failed\n");
}
else {
for (int i = 0; i < N; i++) printf("%d ", record[i].second);
putchar('\n');
qsort(record, N, sizeof(pair<int, int>), cmp);
for (int i = 0; i < N; i++) printf("%d ", record[i].second);
putchar('\n');
}
}
return 0;
}
POJ_3452_Railway Transportation
最新推荐文章于 2020-03-06 15:47:33 发布