UCloud 机房的网络搭建(找规律 计蒜之道第五场)

UCloud 刚刚建立一个新机房,近日正在进行网络搭建。机房内有 nnn 台服务器和 mmm 个分线器,整个机房只有一个网线出口。分线器的作用是将一根网线转换成多根网线。蒜头君也知道每个分线器输出的最大网线根数(不一定要将分线器输出的每根线都用上),问你至少需要使用多少个分线器才能使得每台服务器都有网线可用。

输入格式

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

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

输出格式

输出最少需要的分线器数量。若不能使得所有服务器都有网线可用,输出一行Impossible

样例说明

一共需要 333 个分线器,最大输出根数分别为 7,3,27,3,27,3,2,连接方法如下图所示:

样例输入

10 4
2 7 2 3

样例输出

3

将分线器从大到小排序,优先用输出根数多的分线器。对于 非零 分线器集合 x_1,x_2,\ldots x_mx1,x2,xm,能接入的服务器总数为 \sum_{i=1}^{m}(x_i-1)+1i=1m(xi1)+1

注意处理分线器个数为 00、服务器个数为 00、分线器的输出根数为 00 的情况。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;

int a[105];

int main()
{
	int n,m;
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=1;i<=m;i++){
			scanf("%d",&a[i]);	
		}
		sort(a+1,a+m+1);
		
		int mm=m;
		while(n>1&&mm>0){
			n=n-a[mm]+1;
			mm--;
		}
		if(n>1)cout<<"Impossible"<<endl;
		else printf("%d\n",m-mm);
	}
	return 0;	
} 









全部评论

相关推荐

我已急😭:这科软不就是可以拿钱买吗?我记得那一年一个学校买狠了,数学排名比北大高。
点赞 评论 收藏
分享
暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务