UCloud 机房的网络搭建(计蒜客初赛第五场)

时间:2023-03-09 16:17:56
UCloud 机房的网络搭建(计蒜客初赛第五场)

UCloud 刚刚建立一个新机房,近日正在进行网络搭建。机房内有 nn 台服务器和 mm 个分线器,整个机房只有一个网线出口。分线器的作用是将一根网线转换成多根网线。蒜头君也知道每个分线器输出的最大网线根数(不一定要将分线器输出的每根线都用上),问你至少需要使用多少个分线器才能使得每台服务器都有网线可用。

输入格式

第一行输入 n,m(0 \le n,m \le 100)n,m(0≤n,m≤100)。

第二行输入包含 mm 个整数的数组 A(0 \le A_i \le 10)A(0≤A​i​​≤10) 表示每个分线器输出的最大网线根数。

输出格式

输出最少需要的分线器数量。若不能使得所有服务器都有网线可用,输出一行Impossible

样例说明

一共需要 33 个分线器,最大输出根数分别为 7,3,27,3,2,连接方法如下图所示:

UCloud 机房的网络搭建(计蒜客初赛第五场)

样例输入

10 4
2 7 2 3

样例输出

3
 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm> using namespace std; int main()
{
int n,m;
int a[];
int sum=;
int cou=;
int flag=;
scanf("%d %d",&n,&m);
if(m==){
if(n==){
printf("0\n");
}else if(n==){
printf("0\n");
}else{
printf("Impossible\n");
}
}else{
for(int i=;i<m;i++){
scanf("%d",&a[i]);
}
if(n==){
printf("0\n");
}else if(n==){
printf("0\n");
}else{
sort(a,a+m);
for(int i=m-;i>=;i--){
if(i==m-){
sum+=a[i];
cou++;
}else{
sum+=a[i]-;
cou++;
}
if(sum>=n){
printf("%d\n",cou);
flag=;
break;
}
}
if(flag==){
printf("Impossible\n");
}
}
}
return ;
}