题解:CF2060B Farmer John's Card Game

因为要让牌堆从小到大,所以我们可以用结构体储存每头奶牛的牌和编号然后排序就可以了。
又因为每一轮的出牌顺序一定,所以只要对第一轮(即每头奶牛的最小的牌)排序就可以得到答案。
再枚举每一局,若后面的不符合这个顺序,就输出 $-1$。

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

using namespace std;

void solve() {
    int t;
    cin >> t;

    while (t--) {
        int n, m;
        cin >> n >> m;

        vector<vector<int>> c(n);
        vector<int> s(n), o(n);
		for(int i=0;i<n;i++) o[i]=i+1;
        for (int i = 0; i < n; ++i) {
            c[i].resize(m);
            for (int j = 0; j < m; ++j) {
                cin >> c[i][j];
            }
            sort(c[i].begin(), c[i].end());
            s[i] = c[i][0];
        }

        vector<pair<int, int>> z(n);
        for (int i = 0; i < n; ++i) {
            z[i] = {s[i], o[i]};
        }
        sort(z.begin(), z.end());

        for (int i = 0; i < n; ++i) {
            s[i] = z[i].first;
            o[i] = z[i].second;
        }

        int p = -1;
        bool v = true;

        for (int i = 0; i < m && v; ++i) {
            for (int j = 0; j < n; ++j) {
                int cw = o[j] - 1;
                bool pl = false;
                for (int k = 0; k < m; ++k) {
                    if (c[cw][k] > p) {
                        p = c[cw][k];
                        c[cw][k] = -1;
                        pl = true;
                        break;
                    }
                }
                if (!pl) {
                    v = false;
                    break;
                }
            }
        }

        if (v) {
            for (int i = 0; i < n; ++i) {
                cout << o[i] << " ";
            }
            cout << endl;
        } else {
            cout << -1 << endl;
        }
    }
}

int main() {
    solve();
    return 0;
}