题目链接:
https://acm.sicnu.edu.cn/contest/110/problem/A
题解思路:
这道题是一个全排列的应用,每次生成一个全排列就去判断这个全排列的前n个能否 存放下这组数据,如果能那么这就是答案(因为全排列先生成的数据
就是字典序小的数据)
其中还要注意n<k的情况和永远找不到能放下这些数据的情况输出-1
AC代码
#include<bits/stdc++.h>
using namespace std;
int c[10],s[10],f[10]={0},vis[10]={0},t[10];
int n,k,flag=0;
//判断是否能存放
int check(){
for(int i=1;i<=k;i++){
if(t[i]<s[i]){
return 0;
}
}
return 1;
}
//生成全排列
int dfs(int x){
if(x>n){
if(check()&&flag==0){
for(int i=1;i<=k;i++){
cout<<f[i]<<" ";
}
flag=1;
return 1;
}
}
else{
for(int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=1;
t[x]=c[i];
f[x]=i;
dfs(x+1);
vis[i]=0;
}
}
}
}
int main(){
// freopen("10.in","r",stdin);
// freopen("10.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>c[i];
}
for(int i=1;i<=k;i++){
cin>>s[i];
}
if(n<k){
cout<<-1;
return 0;
}
dfs(1);
if(flag==0){
cout<<-1;
}
return 0;
}