题意:第一行给出三个数n,m,k,n表示接线板的个数,m表示用电器的个数,k表示初始插座的个数,第二行有n个数,第i个数表示有i号接线板有ai个插座,判断插座是否够用。若够用,输出最少的接线板的个数,若不够用,输出-1
链接:http://codeforces.com/problemset/problem/257/A
思路:先对每块接线板的插座数量降序排序,贪心选择尽可能大的值。
注意点:当k>=m时,输出应该为0
以下为AC代码:
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | ||
---|---|---|---|---|---|---|---|---|---|---|
10041593 | Practice: luminous11 | 257A - 17 | GNU C++11 | Accepted | 30 ms | 8 KB | 2015-02-27 11:05:16 | 2015-02-27 11:05:16 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
bool cmp ( const int & a,const int& b ){
return a > b;
}
int main()
{
ios::sync_with_stdio( false );
int n, m, k;
while ( cin >> n >> m >> k ){
int num[55];
for ( int i = 0; i < n; i ++ ){
cin >> num[i];
num[i] --;
}
sort ( num, num + n, cmp );
int ans = k;
int cnt = n;
for ( int i = 0; i < n; i ++ ){
if ( ans >= m ){cnt = i;break;}
ans += num[i];
}
if ( ans >= m )
cout << cnt << endl;
else
cout << "-1" << endl;
}
return 0;
}