7 矩阵中战斗力最弱的 K 行

文章提供了一个编程问题的详细描述,涉及给定矩阵中按战斗力排序的算法实现。问题要求找出军人最少的k行,并按战斗力从弱到强排序。解决方案包括创建自定义结构体来存储行信息,使用sort函数进行排序,并着重强调了比较运算符重载和自定义排序规则的重要性。最后,对算法的时间复杂度进行了分析。

目录

题目 

题目分析

解答

代码

代码详解与难点分析(可无)

分析

算法的性能分析


题目 

作者: Turbo时间限制: 1S章节: 课程设计

问题描述 :

给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。

请你返回矩阵中战斗力最弱的 k 行的索引(行号),按从最弱到最强排序。

如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。

军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。

示例 1:

输入:

5 5

1 1 0 0 0 

1 1 1 1 0 

1 0 0 0 0 

1 1 0 0 0 

1 1 1 1 1

3

输出:

2 0 3

解释:

每行中的军人数目:

行 0 有 2 人

行 1 有 4 人

行 2 有 1 人

行 3 有 2 人

行 4 有 5 人

从最弱到最强对这些行排序后得到 [2,0,3,1,4]

示例 2:

输入:

4 4

1 0 0 0 

1 1 1 1 

1 0 0 0 

1 0 0 0

2

输出:

0 2

解释: 

每行中的军人数目:

行 0 有 1 人

行 1 有 4 人

行 2 有 1 人

行 3 有 1 人

从最弱到最强对这些行排序后得到 [0,2,3,1]

输入说明 :

输入若干行:

第一行输入两个整数m和n,表示矩阵的行数和列数。

之后m行,每行输入n个整数(0或1)表示矩阵的元素。

最后一行输入一个整数k(1 <= k <= m).

提示:

    2 <= n, m <= 100

    1 <= k <= m

    矩阵的元素 不是 0 就是 1

输出说明 :

输出一行k个整数,每个整数后跟一个空格。

输入范例

4 4
1 0 0 0
1 1 0 0
1 0 0 0
1 1 1 0

输出范例

0 2 1 

题目分析

关键在于在输入的同时记录下来每一个队列的独有属性---0的个数,后续根据自己创建的结构体数组中每个元素中这个独有属性进行排序

解答

代码

 

#include "bits/stdc++.h"
using namespace std;
int arr[100][100];
struct attribute{
    int x;
    int num;
    void operator=(attribute att){
        x=att.x;
        num=att.num;
    }
    bool operator>(attribute att){
        return num>att.num;
    }
    bool operator<(attribute att){
        return num<att.num;
    }
};
attribute ary[100];
bool complare(attribute a1,attribute a2){
    if(a1.num!=a2.num)
    return a1.num>a2.num;//这个数大它就弱
    else return a1.x<a2.x;//这个数小它就弱
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
    ary[i].x=i;
    for(int j=0;j<m;j++){
        cin>>arr[i][j];
        if(arr[i][j]==0)
        ary[i].num++;//记录每一行的平民数目
    }

}
sort(ary,ary+n, complare);
int k;
cin>>k;
for(int i=0;i<k;i++){
    cout<<ary[i].x<<" ";
}
    return 0;
}

代码详解与难点分析(可无) 

在自己创建结构体时,由于后需要进行比较大小,所以一定要自己定义出"<"  ">"这些比较符号的运算符重载函数,并且根据题意灵活改变sort排序原则,变成从大到小排序。

int arr[100][100];
struct attribute{
    int x;
    int num;
    void operator=(attribute att){
        x=att.x;
        num=att.num;
    }
    bool operator>(attribute att){
        return num>att.num;
    }
    bool operator<(attribute att){
        return num<att.num;
    }
};
attribute ary[100];
bool complare(attribute a1,attribute a2){
    if(a1.num!=a2.num)
    return a1.num>a2.num;//这个数大它就弱
    else return a1.x<a2.x;//这个数小它就弱
}

分析

算法的性能分析

输入步骤不计入,排序使用了sort函数,时间复杂度为n*logn

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值