测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A20826. 礼盒排序

填空题 较难

题目描述

礼盒排序

题目描述

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

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

1. 先按礼盒总价格从小到大排序;

2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;

3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;

4. 如果仍然相同,按礼盒编号从小到大排序。 请输出排序后的礼盒编号。

输入格式

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

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

输出格式

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

样例

输入样例

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

输出样例

3 4 2 1	

样例解释

4 个礼盒分别为:

编号商品价格总价最大值最小值
13521052
24151051
3224842
43431043

排序过程:

1. 按总价排序,3号礼盒总价最小;

2. 其余总价均为 10,再按最大值排序,4号最大值更小;

3. 1号和2号最大值相同,再按最小值排序,2号更小。

最终顺序为:3 4 2 1

数据范围

保证1≤n≤103,1≤k≤10,商品价格≤104

参考答案

#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Combo { int sum, mx, mn, id; }; bool cmp(const Combo &a, const Combo &b) { if (a.sum != b.sum) return a.sum < b.sum; if (a.mx != b.mx) return a.mx < b.mx; if (a.mn != b.mn) return a.mn < b.mn; return a.id < b.id; } int main() { int n, k; cin >> n >> k; vector<Combo> v(n); for (int i = 0; i < n; i++) { v[i].sum = 0; v[i].mx = -1; v[i].mn = 1e9; v[i].id = i + 1; for (int j = 0; j < k; j++) { int x; cin >> x; v[i].sum += x; v[i].mx = max(v[i].mx, x); v[i].mn = min(v[i].mn, x); } } sort(v.begin(), v.end(), cmp); for (int i = 0; i < n; i++) { cout << v[i].id; if (i + 1 < n) cout << " "; } cout << endl; return 0; }
上一题 下一题