2017 計蒜之道 初賽 第五場 A. UCloud 機房的網絡搭建

題目鏈接:https://nanti.jisuanke.com/t/15766

文章最後給出了題目的完整描述,也可點擊鏈接查看題目。

官方題解: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 剛剛建立一個新機房,近日正在進行網絡搭建。機房內有 

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

發佈了177 篇原創文章 · 獲贊 78 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章