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

来源:互联网 发布:淘宝客怎样才能赚钱 编辑:程序博客网 时间:2024/05/21 06:30

题目内容:

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 42 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";}


阅读全文
0 0
原创粉丝点击