链接和思路
OJ链接:传送门。
本题思路不难,理解上级仓库的含义后,暴力验证即可。最坏情况为整个输入序列都是上级仓库在前,下级仓库在后,其复杂度分析如下:
给定的 n n n个向量都要与另外( n − 1 n-1 n−1)个向量相互比较,一共 n ( n − 1 ) n(n-1) n(n−1)次向量比较;由于向量为 m m m维,单次向量比较最多需要 m m m次数值比较。因此只需要不多于 m n ( n − 1 ) mn(n-1) mn(n−1)次数值比较即可求解本题,时间复杂度为 O ( m n 2 ) O(mn^2) O(mn2)。
由于给定的 n n n和 m m m不大,其中, 0 < m ≤ 10 0 < m \le 10 0<m≤10, 0 < n ≤ 1000 0 < n \le 1000 0<n≤1000,使用暴力法求解在有限时间内是可以接受的。否则,要考虑构建更为复杂的索引。
AC代码
#include <iostream>
#include <vector>
using namespace std;
bool is_lower(const vector<int> &a, const vector<int>&b) {
for (int i = 0; i < a.size(); i++)
if(a[i] >= b[i])
return false;
return true;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>v(n);
for (auto &i:v){
i.resize(m);
for (auto &j:i)
cin >> j;
}
for (int i = 0; i < v.size(); i++){
bool flag = false;
for (int j = 0; j < v.size(); j++){
if (j == i) continue;
if(is_lower(v[i],v[j])){
cout << j + 1 << endl;
flag = true;
break;
}
}
if(!flag)
cout << 0 << endl;
}
return 0;
}