多属性记录表示法

问题描述

假设有n场活动,第i场活动的开始时间为a[i],结束时间为b[i],要求按开始时间从小到大排序,如开始时间相同则按结束时间从小到大排,输出活动编号及相应的起止时间。

结构体描述法

常规的做法是用结构体数组来保存活动信息。

#include <bits/stdc++.h>
using namespace std;
struct st {
    int a, b, x;
}f[10];
int n;
bool cmp(st u, st v) {
    if (u.a != v.a) reutrn u.a < v.a;
    return u.b < v.b;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> f[i].a >> f[i].b;
        f[i].x = i+1;
    }
    sort(f, f+n, cmp);
    for (int i = 0; i < n; i++)
        cout << f[i].x << ": (" << f[i].a << "," << f[i].b << ")\n";
    return 0;
}

一维数组表示法

也可以直接用三个一维数组来表示。

#include <bits/stdc++.h>
using namespace std;
int n, a[10], b[10], x[10];
bool cmp(int u, int v) {
    if (a[u] != a[v]) return a[u] < a[v];
    return b[u] < b[v];
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i] >> b[i];
        x[i] = i+1;
    }
    sort(x, x+n);
    for (int i = 0; i < n; i++)
        cout << x[i] << ": (" << a[x[i]] << "," << b[x[i]] << ")\n";
    return 0;
}

从表达能力上看,一维数组比结构体表示法要强,因为结构体表示法在做排序后不能快速获取原来编号的记录,而一维数组表示法却可方便地取到。

Table of Contents