题意是 A组织公司团建,开销由A承担,每个员工都有自己的最小开销Xi,同时A也会给出一个每个人的最小开销x,两笔开销相比较取较小的开销。 所有的开销Sum=xi求和 A还有一个总计的最小开销M_。 现要求能满足Sum<=M_的最大x,若x可取无限大,则输出infinite。
#include<iostream>
#include<algorithm>
using namespace std;
long long b[200100];
long long N_, M_;
long long a[200100];
long long i = 1;
long long sum = 0;
int compare(int a, int b) {
if (a <= b) {
return a;
}
else {
return b;
}
}
int division(int x) {
if (x % 2 == 1) {
return x / 2 + 1;
}
else {
return x / 2;
}
}
int div(int min_) {//return 1 means down,2 means up
int j = 1;
long long Sum = 0;
while (j <= N_) {
Sum += compare(a[j], min_);
j++;
}
if (Sum <= M_) {
return 2;
}
else {
return 1;
}
}
int main() {
cin >> N_ >> M_;
while (i <= N_) {
cin >> a[i];
sum += a[i];
i++;
}
if (sum <= M_) {
cout << "infinite";
return 0;
}
sort(a + 1, a + N_ + 1);
int upper = a[N_] - a[1] + 1;
int lower = 0;
int f = 1;
while (f == 1) {
int h = division((upper + lower));
if (div(h) == 2 && div(h + 1) == 1) {
f = 2;
cout << h;
}
if (div(h) == 1) {
upper = h;
}
else if (div(h) == 2) {
lower = h;
}
}
return 0;
}