把认证写出来的题目发出来,大家共同讨论。第一题思路不难,就是应该先看清题再下手,一开始一直以为如果出现两个上级应该选整体更小的,后来憋了好久才发现是编号更小的。
题目:
样例输入输出以及说明:
关键就在于遍历每一个仓库位置,然后再搜索它的上级,穷举法即可,第一题也没有时间复杂度要求。
#include<iostream>
using namespace std;
int A[1010][11]; //存仓库坐标,直接按要求的数据量去构造数组
int On[1010]={0}; //存的是i号仓库的上级号,最后输出这个数组
bool is_on(int i,int j,int k){ //函数用来判j是不是i的上级(如果是,每一位jt都应该严格大于it)
bool result = true;
for(int t = 0; t<k;t++){
if(A[i][t] >= A[j][t]){
result = false;
}
}
return result;
}
int main(){
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++){
for(int j = 0;j < m;j++){
cin >> A[i][j];
}
}
for(int i = 1; i <= n;i++){
int MinIndex = 0; //暂存上级编号
for(int j = 1;j <= n;j++){
if(i == j){ //遍历遇到自己,不比较
continue;
}
if(MinIndex != 0){ //不为0时说明已经有一个上级仓库了,就应该选择一下编号最小的
int minTem = MinIndex;
if(is_on(i,j,m)){
MinIndex = j;
}
if(MinIndex > minTem){
MinIndex = minTem;
}
}
else{ //为0说明这是第一个上级仓库,直接把j的值给了MinIndex即可
if(is_on(i,j,m)){
MinIndex = j;
}
}
}
On[i] = MinIndex;
}
for(int i = 1;i <= n;i++){
cout << On[i] << endl;
}
return 0;
}