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≤Ai≤10) 表示每个分线器输出的最大网线根数。
输出格式
输出最少需要的分线器数量。若不能使得所有服务器都有网线可用,输出一行Impossible
。
样例说明
一共需要 33 个分线器,最大输出根数分别为 7,3,27,3,2,连接方法如下图所示:
样例输入
10 4 2 7 2 3
样例输出
3
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 8 int main() 9 { 10 int n,m; 11 int a[200]; 12 int sum=0; 13 int cou=0; 14 int flag=0; 15 scanf("%d %d",&n,&m); 16 if(m==0){ 17 if(n==0){ 18 printf("0\n"); 19 }else if(n==1){ 20 printf("0\n"); 21 }else{ 22 printf("Impossible\n"); 23 } 24 }else{ 25 for(int i=0;i<m;i++){ 26 scanf("%d",&a[i]); 27 } 28 if(n==1){ 29 printf("0\n"); 30 }else if(n==0){ 31 printf("0\n"); 32 }else{ 33 sort(a,a+m); 34 for(int i=m-1;i>=0;i--){ 35 if(i==m-1){ 36 sum+=a[i]; 37 cou++; 38 }else{ 39 sum+=a[i]-1; 40 cou++; 41 } 42 if(sum>=n){ 43 printf("%d\n",cou); 44 flag=1; 45 break; 46 } 47 } 48 if(flag==0){ 49 printf("Impossible\n"); 50 } 51 } 52 } 53 return 0; 54 }