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

xiaoxiao2021-02-27  266

题目内容:

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"; }
转载请注明原文地址: https://www.6miu.com/read-10857.html

最新回复(0)