社区讨论

90分求助!!WA on 17,18

P14635[NOIP2025] 糖果店参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mijxgzuk
此快照首次捕获于
2025/11/29 14:46
3 个月前
此快照最后确认于
2025/11/30 09:40
3 个月前
查看原帖
CPP
#include <cstdio>
#include <algorithm>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MAXSZ = 1 << 20;
char ch = '0' - 1, buf[MAXSZ], *p1, *p2;
#define ge() (p1 == p2 && (p2 = buf + fread(p1 = buf, 1, MAXSZ, stdin), p1 == p2) ? EOF : *p1++)
template <typename T_T>
inline void read(T_T &x) {
	x = 0;
	while (ch < '0' || '9' < ch) ch = ge();
	while ('0' <= ch && ch <= '9') {
		x = x * 10 + (ch ^ 48);
		ch = ge();
	}
}
template <typename T_T>
inline void write(T_T x) {
	if (x > 9) write(x / 10);
	putchar(x % 10 | 48);
}
template <typename T_T>
inline T_T min(T_T a, T_T b) {return a < b ? a : b;}
template <typename T_T>
inline T_T max(T_T a, T_T b) {return a > b ? a : b;}

const int N = 1e5 + 5;
struct Ryan {
	ll a, b;
	bool operator<(const Ryan &other) const {
		if (a != other.a) return a < other.a;
		return b < other.b;
	}
}item[N], ed[N];
int n;
ll m, maxn;

int main() {
	// freopen("Ryan.in", "r", stdin);
	// freopen("Ryan.out", "w", stdout);

	read(n), read(m);
	for (int i = 1; i <= n; i++)
		read(item[i].a), read(item[i].b);
	std::sort(item + 1, item + n + 1);

	ed[n + 1].a = ed[n + 1].b = 2e18;
	for (int i = n; i >= 1; i--) {
		if (ed[i + 1].a <= item[i].a + item[i].b) {
			ed[i] = ed[i + 1];
			if (ed[i + 1].a == item[i].a + item[i].b && ed[i + 1].b > item[i].a)
				ed[i].b = item[i].a;
		}
		if (ed[i + 1].a > item[i].a + item[i].b)
			ed[i] = {item[i].a + item[i].b, item[i].a};
	}

	ll sum = 0; item[0].a = 0;
	for (int i = 0; i <= n; i++) {
		sum += item[i].a;
		if (sum > m) continue;

		ll cnt = i + 2 * ((m - sum) / ed[i + 1].a);
		if ((m - sum) % ed[i + 1].a >= ed[i + 1].b) ++ cnt;
		maxn = max(maxn, cnt);

		// printf("%lld %lld %lld %lld\n", sum, ed[i + 1].a, ed[i + 1].b, maxn);
	}

	write(maxn), putchar('\n');
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...