UCloud 刚刚建立一个新机房,近日正在进行网络搭建。机房内有 n 台服务器和 m 个分线器,整个机房只有一个网线出口。分线器的作用是将一根网线转换成多根网线。蒜头君也知道每个分线器输出的最大网线根数(不一定要将分线器输出的每根线都用上),问你至少需要使用多少个分线器才能使得每台服务器都有网线可用。
输入格式
第一行输入 n,m(0≤n,m≤100)。
第二行输入包含 m 个整数的数组 A(0≤Ai≤10) 表示每个分线器输出的最大网线根数。
输出格式
输出最少需要的分线器数量。若不能使得所有服务器都有网线可用,输出一行Impossible
。
样例说明
一共需要 3 个分线器,最大输出根数分别为 7,3,2,连接方法如下图所示:
样例输入
10 4 2 7 2 3
样例输出
3
注意:一定要考虑所有的可能输入
程序:
#include <stdio.h>
//#include <cstdio>
//#include <algorithm>
//#include <string>
//#include <cstring>
//using namespace std;
#define ll long long
void quickSort(int s[], int l, int r)
{
if(l<r){
int x=s[l];
int i=l,j=r;
while(i<j){
while(i<j&&s[j]>x)
j--;
if(i<j)
s[i++]=s[j];
while(i<j&&s[i]<=x)
i++;
if(i<j)
s[j--]=s[i];
}
s[i]=x;
quickSort( s, l, i-1) ;
quickSort( s, i+1, r) ;
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(m==0){
if(n==0){
printf("0");
break;
}else if(n==1){
printf("0");
break;
}else{
printf("Impossible");
break;
}
}
if(n==1){
printf("0");
break;
}
if(n==0){
printf("0");
break;
}
int A[m];
for(int i=0;i<m;i++){
scanf("%d",&A[i]);
}
quickSort(A,0,m-1);
int count=0;
int temp=0;
int num=0;
int flag=0;
for(int i=m-1;i>=0;i--){
temp+=A[i];
num++;
if(temp>=count+n){
printf("%d",num);
flag=1;
break;
}
count++;
}
if(flag==0){
printf("Impossible");
}
}
return 0;
}