作者: 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.变量较多的情况容易混乱,需要很清楚每一块到底在做什么,步骤是什么,如果需要的话把步骤提前描述一下就能让我们不容易分神