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

时间:2021-05-12 00:37:41

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

输入格式

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

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

输出格式

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

样例说明

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

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

样例输入

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 }