记录一下CCF CSP第32次认证第一题仓库规划题解,头秃...
思路
1.采用vector,自定义一个结构体cangku,其中包括两个元素,一个为每个仓库的id,另一个为一个数组,用来记录仓库的编码。
struct cangku{
int a[N];
int id; //添加id来识别每个仓库
};
2.初始化每个仓库的上级仓库id都为0,
vector<int>superior_id(n,0);
3.定义一个bool变量来标记是否已经找到了上级仓库;
定义一个bool变量来标记某仓库的所有维度是否都大于当前仓库;
定义一个int变量来初始化最小的上级id。
bool found = false; //标记是否找到了上级仓库;
bool all_greater = true; //标记所有维都大于当前仓库;
int min_superior_id = n+1; //初始化为比所有id都大的值
4.先录入各个仓库的信息,接着从第一个仓库开始,依次与别的仓库比较,用到了三次循环。
完整代码(具体注释如下)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
int n,m;
struct cangku{
int a[N];
int id; //添加id来识别每个仓库
};
int main(){
cin>>n>>m; //行数和维度
vector<cangku>vec;
for(int i = 0;i<n;i++){
cangku b;
b.id = i+1;
for(int j = 0;j<m;j++){
cin>>b.a[j];
}
vec.push_back(b);
}
vector<int>superior_id(n,0); //初始化每个仓库的上级仓库id都为 0
for(int i = 0;i<n;i++){
bool found = false; //标记是否找到了上级仓库;
int min_superior_id = n+1; //初始化为比所有id都大的值
for(int j = 0;j<n;j++){
if(i == j) continue; //跳过自己
bool all_greater = true; //标记所有维都大于当前仓库;
for(int k = 0;k<m;k++) {
if(vec[j].a[k]<=vec[i].a[k]){ //某一维比其小
all_greater = false;
break;
}
}
if(all_greater && j+1<min_superior_id){
min_superior_id = j+1; //j+1是因为下表从1开始
found = true;
}
}
if(found){
superior_id[i] = min_superior_id; //将最小的上级id存入vector中
}
}
for(int i = 0;i<n;i++){
cout<<superior_id[i]<<endl;
}
}