贪心
因为要礼物数量最多,所以先找礼物价格最低的。
对数组a进行从大到小的排序,之后就从小到大求和。若加上的费用使总和大于了k,就对最后加上来的费用除以2,进行向上取整。若总和仍然大于k,就舍弃这个礼物。最后输出即可。
细节:因为用到除法,类型用double,double也占8Byte,但是可以表示的数据的范围远远的大于long long。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
double a[maxn];
int main()
{
int n;
double k; cin >> n >> k;
if (k == 0){
cout << 0;
return 0;
}
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
int ans = 0, sum = 0;
for (int i = 1; i <= n; i++){
sum += a[i];
ans++;
if (sum > k){
long long tmp = (long long)a[i] / 2;
if (tmp < a[i] / 2) tmp++;
sum -= a[i] - tmp;
if (sum > k){
ans--;
break;
}
}
}
cout << ans;
return 0;
}