专栏文章

题解:P8838 [传智杯 #3 决赛] 面试

P8838题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioymjaj
此快照首次捕获于
2025/12/03 03:17
3 个月前
此快照最后确认于
2025/12/03 03:17
3 个月前
查看原文
前言:本文原创,请勿抄袭。
现在有 nn 个服务器,服务器 ii 最多能处理 aia_i 大小的数据。
接下来会有 kk 条指令 bkb_k,指令 ii 表示发送 bib_i 的数据,需要你分配一个空闲的服务器。
请你算出一个序列 pkp_k 表示指令 ii 的数据分配给服务器 pip_i,且 pkp_k 的字典序最小;如果无法分配,输出 -1
对于所有数据,n,k6n,k\leq 6ai,bi10a_i,b_i \leq 10
首先看数据范围,对于所有数据,n,k6n,k\leq 6ai,bi10a_i,b_i \leq 10。那么,数据范围特别特别的小,而且考虑到需要分配,就可以采用我们的搜索。在这里,肯定用深度优先搜索。搜索的东西就是需要分配的东西 aia_i。当然,不是所有的 aia_i 都可以。在这里,如果 aibxa_i≥b_x 才能分配,因为要有这个能力才可以啊。最后,我们只输出第一个答案即可,用个变量标记有没有答案即可。
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=15;
int n,k;
int a[maxn],b[maxn];
bool vis[maxn],flag=0;
int id[maxn];
void dfs(int x){
	if(x>k){
		if(!flag){
			for(int i=1;i<=k;i++){
			    cout<<id[i]<<" ";
		    }
		}
		flag=1;
		return ;
	}
	for(int i=1;i<=n;i++){
		if(a[i]>=b[x]&&vis[i]==0){
			vis[i]=true; 
			id[x]=i;
			dfs(x+1);
			id[x]=0;
			vis[i]=0;
		}
	}
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	}
	for(int i=1;i<=k;i++){
		cin>>b[i];
	}
	dfs(1);
	if(flag==0){
		cout<<-1;
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...