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
相關文章
相關標籤/搜索