题目内容:
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分析:拿到题之后,第一反应就是简单的模拟。首先将输出器的数目从大到小的顺序排序,然后用总电脑数依次减掉已经排好序的输出器的数目。当减到n的大小小于等于0的时候,所有的电脑已经连接完了,剩下的就是将输出器连一起了。然后在继续利用连电脑的同样的方法来模拟输出器的连接。提交之后结果错误。第一个测试点都没有通过!!!
正解:应该按照图中的样子来连接,因为图中的连接方法有很多,但是题目只选择了那一种。所有这个题目的正确连接方法就是按照题目图片中,一个连接器除了第一个外只连a[i]-1个,留出的内个空连接上一个输出器。但是本体即为重要的一点就是——特判!!!一定要考虑周全,就是当n=0,n=1,m=0的这几种情况!!
code:
#include<iostream>
#include<algorithm>
using namespace std;
bool com(int a,int b){
return a>b;
}
int main(){
int n,m;
int a[100];
cin>>n>>m;
for(int i=0;i<m;i++) cin>>a[i];
if(n==0||n==1){
cout<<0;
return 0;
}
if(m==0){
cout<<"Impossible";
return 0;
}
sort(a,a+m,com);
if(n-a[0]>0) n-=a[0];
else{
cout<<1;
return 0;
}
for(int i=1;i<m;i++){
if(n-a[i]+1>0) n-=a[i]-1;
else{
cout<<i+1;
return 0;
}
}
cout<<"Impossible";
}