B4502 [GESP202603 四级] 礼盒排序

题目描述

商店推出了许多礼盒,每个礼盒中包含 ​k 件商品,每件商品都有一个价格。

现在需要对这些礼盒进行排序,排序规则如下:

  1. 先按礼盒总价格从小到大排序;
  2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
  3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
  4. 如果仍然相同,按礼盒编号从小到大排序。

请输出排序后的礼盒编号。

输入格式

第一行包含两个整数 ​n​k,分别表示礼盒数量和每个礼盒中商品的数量。

接下来 ​n 行,每行包含 ​k 个整数,第 ​i 行表示第 ​i 个礼盒中各商品的价格。

输出格式

输出一行,包含排序后的礼盒编号(编号从 ​1 开始),用空格分隔。

输入输出样例 #1

输入 #1

4 3
3 5 2
4 1 5
2 2 4
3 4 3

输出 #1

3 4 2 1

说明/提示

样例解释

编号 商品价格 总价 最大值 最小值
​1 ​3\ 5\ 2 ​10 ​5 ​2
​2 ​4\ 1\ 5 ​10 ​5 ​1
​3 ​2\ 2\ 4 ​8 ​4 ​2
​4 ​3\ 4\ 3 ​10 ​4 ​3

排序过程:

  1. 按总价排序,​3 号礼盒总价最小;
  2. 其余总价均为 ​10,再按最大值排序,​4 号最大值更小;
  3. ​1 号和 ​2 号最大值相同,再按最小值排序,​2 号更小。

最终顺序为:​3 \ 4 \ 2 \ 1

数据范围

保证 ​1 \leq n \leq 10^3​1 \leq k \leq 10​1 \leq 商品价格 ​\leq 10^4

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    int h[105][105];
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++)
            cin >> h[i][j];
    }
    for(int i = 0; i <= max(n, m) + 1; i++)
        h[i][0] = h[0][i] = h[i][m + 1] = h[n + 1][i] = 1e9;
    int ans = 0;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            bool ok = true;
            for(int i2 = i - 1; i2 <= i + 1; i2++) {
                for(int j2 = j - 1; j2 <= j + 1; j2++)
                    if(h[i][j] > h[i2][j2]) {
                        ok = false;
                        break;
                    }
                }
            ans += ok;
        }
    }
    cout << ans;
    return 0;
}