P8838 [传智杯 #3 决赛] 面试
题目背景
disangan233 和 disangan333 去面试了,面试官给了一个问题,热心的你能帮帮他们吗?
题目描述
现在有 nnn 个服务器,服务器 iii 最多能处理 aia_iai 大小的数据。
接下来会有 kkk 条指令 bkb_kbk,指令 iii 表示发送 bib_ibi 的数据,需要你分配一个空闲的服务器。
请你算出一个序列 pkp_kpk 表示指令 iii 的数据分配给服务器 pip_ipi,且 pkp_kpk 的字典序最小;如果无法分配,输出 “-1”。
对于所有数据,n,k≤6n,k\leq 6n,k≤6,ai,bi≤10a_i,b_i \leq 10ai,bi≤10。
输入格式
输入共 333 行。
第 111 行输入 222 个正整数 n,kn,kn,k。
第 222 行输入 nnn 个正整数 aia_iai,表示服务器 iii 最多能处理的数据大小。
第 333 行输入 kkk 个正整数 bib_ibi,表示指令 iii。
输出格式
输出共 111 行 kkk 个正整数 p1…pkp_1\ldots p_kp1…pk,或者输出 “-1”。
输入输出样例 #1
输入 #1
6 6
1 9 1 9 8 1
1 1 4 5 1 4
输出 #1
1 3 2 4 6 5
说明/提示
样例解释
第 1 条指令分给服务器 1;
第 2 条指令分给服务器 3;
第 3 条指令分给服务器 2;
第 4 条指令分给服务器 4;
第 5 条指令分给服务器 6;
第 6 条指令分给服务器 5。
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,k,a[7],b[7],p[7];
bool f=1,u[7];
void dfs(int s){
if(s==k+1){
if(f)
for(int i=1;i<=n;i++)
printf("%d ",p[i]);
f=0;
return;
}
for(int i=1;i<=n;i++)
if(a[i]-b[s]>=0 &&!u[i]){
p[s]=i,u[i]=1;
dfs(s+1);
u[i]=0;
}
return;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=k;i++)
scanf("%d",b+i);
dfs(1);
if(f)
puts("-1");
return 0;
}
后续:
接下来我会不断用C++来实现信奥比赛中的算法题、C++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容