2017 计蒜之道 初赛 第五场——A. UCloud 机房的网络搭建

题目内容:

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

输入格式

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

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

输出格式

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

样例说明

一共需要 33 个分线器,最大输出根数分别为 7,3,27,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";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值