求助站外题(tle了)
  • 板块题目总版
  • 楼主fryfry
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/3 22:09
  • 上次更新2024/8/4 08:29:38
查看原帖
求助站外题(tle了)
593369
fryfry楼主2024/8/3 22:09

题意是 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;
}

2024/8/3 22:09
加载中...