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

题目连接:https://nanti.jisuanke.com/t/15766html

文章最后给出了题目的完整描述,也可点击连接查看题目。ios

官方题解:https://www.jisuanke.com/article/9v3lgyb4数组


这应该是一道简单题,可是须要考虑到几组特例 ( ▼-▼ ) 不少人WA在特例上
服务器

个人思路:网络

  • 先按照每一个分线器输出的最大网线根数降序排列
  • 不考虑特列的状况下,实际链接服务器的网线根数 = 使用的分线器网线根数之和 - 使用的分线器个数 - 1
  • n==0时,即服务器数量为0,此时不须要分线器,即须要的分线器数量为0
  • n==1时,即仅有一台服务器,此时这台服务器直接链接网线便可,不须要分线器,须要的分线器数量为0


#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    int a[101];
    for(int i=0; i<m; ++i)
        cin>>a[i];
    sort(a,a+m,greater<int>());  //降序
    if(n==0 || n==1)  //n等于0时,即服务器数量为0,此时不须要分线器。n等于1时,即仅有一台服务器,此时这台服务器直接链接网线便可,不须要分线器。
        cout<<0<<endl;
    else{
        int mount=0;
        bool flag=true;
        for(int i=0; i<m; ++i){
            mount += a[i];  //前i个分线器网线根数之和
            if((mount-i) >= n){  //实际链接服务器的网线根数
                cout<<i+1<<endl;
                flag=false;  //全部服务器都有网线可用,跳出循环,改变标记状态
                break;
            }
        }
        if(flag)  //循环结束后,不能使得全部服务器都有网线可用。由于若循环时检测到全部服务器都有网线可用的状况,则标记状态会改
            cout<<"Impossible\n";
    }
    return 0;
}





UCloud 刚刚创建一个新机房,近日正在进行网络搭建。机房内有 url

nn 台服务器和 mm 个分线器,整个机房只有一个网线出口。分线器的做用是将一根网线转换成多根网线。蒜头君也知道每一个分线器输出的最大网线根数(不必定要将分线器输出的每根线都用上),问你至少须要使用多少个分线器才能使得每台服务器都有网线可用。spa

输入格式

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

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

输出格式

输出最少须要的分线器数量。若不能使得全部服务器都有网线可用,输出一行Impossiblehtm

样例说明

一共须要 33 个分线器,最大输出根数分别为 7,3,27,3,2,链接方法以下图所示:

样例输入

10 4
2 7 2 3

样例输出

3
相关文章
相关标签/搜索