对于每个仓库来说,按照从编号从低到高枚举其他的仓库,一旦找到符合要求的立即输出即可。直接枚举的时间复杂度为$O(n ^ 2m)$,最坏情况下大概是$10^7$的复杂度,故直接枚举即可。
C++代码:
#include<iostream>
using namespace std;
const int N = 1010, M = 15;
int g[N][N];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &g[i][j]);
for(int i = 1; i <= n; i ++) // 枚举每个仓库
{
int res = 0;
for(int j = 1; j <= n; j ++) // 枚举哪些仓库可以做为仓库i的上级
{
if(j == i) continue;
bool flag = true;
for(int k = 1; k <= m; k ++) // 判断每个状态是否符合要求
if(g[j][k] <= g[i][k])
flag = false;
if(flag)
{
res = j;
break;
}
}
printf("%d\n", res);
}
return 0;
}
如果数据输入是:
5 2
0 0
3 3
2 2
1 1
4 4
输出则是
2
5
2
2
0
这不符合题目要求啊,应该是要选选择编号较小的仓库作为其上级啊
在这里要对符合条件的数据进行遴选,应该怎么做呢?
啊,这个输出不就是2,5,2,2,0嘛
不应该是4,5,2,3,0吗?
0 0对于1 1和3 3不应该选1 1吗?可能是我理解错问题了,可以解释一下为什么要选3 3吗?(我太菜了)
其实和代码没有关系啦 可以再看一下问题 是输出满足条件的最小编号 1 1 和 3 3 都满足条件对不对 很显然 3 3 是 2 号而 1 1 是4号 所以要输出的是小号 也就是2号 不是水平的问题 可能是题目没看仔细啦。
好的,昨天听闫总讲题目时,我也发现了,谢谢你的指正