2159: 布线
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 201 Solved: 31
Submit Status Web Board
Description
DML准备新建一个网吧,但是之前要进行网络搭建。DML的网吧里面有 N 台电脑和 M 个分线器,但是整个网吧只有一个网线出口。分线器的作用是将一根网线转换成多根网线。DML也知道每个分线器输出的最大网线根数S,那么至少需要使用多少个分线器才能使得每台电脑都连上网络?
Input
本题为多实例测试
第一行输入 n,m(0 <= n,m <= 100)
第二行输入 每个分线器输出的最大网线根数S(0≤S≤100)。
Output
输出最少需要的分线器数量。若不能使得所有服务器都有网线可用,输出“Impossible”(不带引号)。
Sample Input
10 4
2 7 2 3
Sample Output
3
HINT
不一定要将分线器输出的每根线都用上
题解:
第一眼的感觉就是贪心,把分线器网线根数从大到小排序,n依次减去,如果n>0,说明服务器接不完,就需要留一个口接下一个分线器,即n++
其次要注意的是n==0和n==1时,输出0,因为网吧自带一个接口
#include<iostream>
#include<algorithm>
using namespace std;
int a[105];
int main(){
int aim,n;
while(cin>>aim>>n){
for(int i=0;i<n;i++){
cin>>a[i];
}
if(aim==0||aim==1){
cout<<0<<endl;
continue;
}
sort(a,a+n,greater<int>());
int cnt=0;
for(int i=0;i<n;i++){
aim-=a[i];
cnt++;
if(aim<=0){
break;
}
else{
aim++;
// cout<<aim<<endl;
}
}
if(aim>0)cout<<"Impossible"<<endl;
else cout<<cnt<<endl;
}
return 0;
}