A. UCloud 机房的网络搭建

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

注意:一定要考虑所有的可能输入

程序:

#include <stdio.h>
//#include <cstdio>
//#include <algorithm>
//#include <string>
//#include <cstring>
//using namespace std;
#define ll long long
void quickSort(int s[], int l, int r)  
{  
	     if(l<r){
	     	int x=s[l];
	     	int i=l,j=r;
	     	while(i<j){
	     		while(i<j&&s[j]>x)
	     			j--;
				 if(i<j)
				 	s[i++]=s[j];
				 while(i<j&&s[i]<=x)
				 	i++;
				 if(i<j)
				 	s[j--]=s[i];
			 }
			 s[i]=x;
			 quickSort( s, l, i-1) ;
			 quickSort( s, i+1, r) ; 
		 }
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF){
    	if(m==0){
    		if(n==0){
    			printf("0");
    			break;
			}else if(n==1){
				printf("0");
				break;
			}else{
				printf("Impossible");
				break;
			} 
		}
		if(n==1){
			printf("0");
			break;
		}
		if(n==0){
			printf("0");
			break;
		}
		
		int A[m];
    	for(int i=0;i<m;i++){
    		scanf("%d",&A[i]);
		}
	    quickSort(A,0,m-1); 
	    int count=0;
	    int temp=0;
	    int num=0;
	    int flag=0;
	    for(int i=m-1;i>=0;i--){
	    	temp+=A[i];
	    	num++;
	    	if(temp>=count+n){
	    		printf("%d",num);
	    		flag=1;
	    		break;
			}
			count++;
		}
		if(flag==0){
		   printf("Impossible");
	    }
	    
	}
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值