http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1674
充电
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 122(55 users) Total Accepted: 60(51 users) Rating: Special Judge: No
Description
玻璃小屋内有n个插排,屋内有 m 个需要供电的机器,并且墙上有k个可以直接使用的插口。知道了每个插排上的插口的个数,并且所有的插头和插口都是可以匹配的。问你最少用几个插排可以让所有机器都供上电?
Input
多组测试数据,每组第一行输入n, m, k。(1 ≤ n, m, k ≤ 50)
第二行有n个数,分别表示每个插排上插口的个数。
Output
输出最少需要几个插排。如果有电器无法充上电则输出-1。
每组输出占一行。
Sample Input
3 5 3
3 1 2
4 7 2
3 3 2 4
5 5 1
1 3 1 2 1
Sample Output
1
2
-1
本题的解题思路如下:
首先,一个插排占用一个可以直接使用的插口。
(上面这点如果想不清楚的话,这个题不用做了)
下面就开始分情况讨论了。先判断不用插排是不是可以直接完成任务需要,其次的话,就开始模拟过程了,先给序列从大到小进行排序,排序完之后就是模拟过程了,给出一个位置给插孔数最多的插排。
下面是AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[550];
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,m,k;
while(~scanf("%d %d %d",&n,&m,&k))
{
memset(a,0,sizeof(a));
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
int sum=0;
if(k-m>=0)
{
printf("0\n");
}
else
{
sum=k;
int re=0,flag=0;
for(int i=0; i<n; i++)
{
sum=sum+a[i]-1;
re++;
if(sum>=m)
{
flag=1;
printf("%d\n",re);
break;
}
}
if(flag==0)
{
printf("-1\n");
}
}
memset(a,0,sizeof(a));
}
return 0;
}