題目鏈接: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 剛剛建立一個新機房,近日正在進行網絡搭建。機房內有
n 臺服務器和 m 個分線器,整個機房只有一個網線出口。分線器的作用是將一根網線轉換成多根網線。蒜頭君也知道每個分線器輸出的最大網線根數(不一定要將分線器輸出的每根線都用上),問你至少需要使用多少個分線器才能使得每臺服務器都有網線可用。
輸入格式
第一行輸入 n,m(0≤n,m≤100)。
第二行輸入包含 m 個整數的數組 A(0≤Ai≤10) 表示每個分線器輸出的最大網線根數。
輸出格式
輸出最少需要的分線器數量。若不能使得所有服務器都有網線可用,輸出一行Impossible
。
樣例說明
一共需要 3 個分線器,最大輸出根數分別爲 7,3,2,連接方法如下圖所示:
樣例輸入
10 4 2 7 2 3
樣例輸出
3