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

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

1.问题描述 :

给你一个大小为 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.输入说明 :

输入若干行:

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

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

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

提示:

    2 <= n, m <= 100

    1 <= k <= m

    矩阵的元素 不是 0 就是 1

3.输出说明 :

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

#include<iostream>//数据流输入/输出:cin>>,cout<<的头文件
#include <algorithm>//算法类函数:sort().....的头文件
using namespace std;
/*
 *输入矩阵和k行
 * 对每一行进行1的计数,存入数组
 * 从小到大用直接选择排序的思路从小到大输出(注意相同输出第一个)
 * 找到了就结束,结束循环输出
 */
int main()
{
    int m,n,i,j,k=0,p=0,a[105][105],b[105]={0},t,q;
    cin>>m>>n;
    for(i=0;i<m;i++)//同时进行两个数组的存储
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==1)b[p]++;
        }
        p++;
    }
    cin>>k;
    for(i=0;i<k;i++)//使用直接选择排序的思路,一个个找
    {
        t=n;
        for(j=0;j<m;j++)
        {
            if(b[j]<t)
            {
                t=b[j];
                q=j;//记录下位置
            }
        }
        cout<<q<<" ";
        b[q]=n+1;//别忘了把最小的这个处理成最大的
    }
    return 0;
}

反思:

1.这道题的重点是值与位置的分开标记,把军人数全部放在一个数组,下标一一对应。然后找到一个最小的就输出它的下标,不需要对下标再有什么处理了。

2.变量较多的情况容易混乱,需要很清楚每一块到底在做什么,步骤是什么,如果需要的话把步骤提前描述一下就能让我们不容易分神

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值