社区讨论

CCF爆0,luogu 100

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

讨论操作

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

当前回复
10 条
当前快照
1 份
快照标识符
@mipybck3
此快照首次捕获于
2025/12/03 19:56
3 个月前
此快照最后确认于
2025/12/05 21:15
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, m, minid, minsum, minsumx, minsumy;
struct Node
{
	int x, y, sum, id;
} c[N];
bool cmp(const Node &A, const Node &B)
{
	return A.sum < B.sum;
}
bool cmp1(const Node &A, const Node &B)
{
	return A.x < B.x;
}
int check(int x)
{
	int mm = m - x * minsum, res = 0;
	for (int i = 1; i <= n; i++)
	{
		if (mm - c[i].x >= 0)
			mm -= c[i].x, res++;
	}
	return res + x * 2;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	freopen("candy.in", "r", stdin);
	freopen("candy.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> c[i].x >> c[i].y;
		c[i].sum = c[i].x + c[i].y;
		c[i].id = i;
	}
	sort(c + 1, c + n + 1, cmp);
	minid = c[1].id, minsum = c[1].sum, minsumx = c[1].x, minsumy = c[1].y;
	sort(c + 1, c + n + 1, cmp1);
	int l = 0, r = m / minsum, ans = 0;
	while (l <= r)
	{
		int mid = (l + r) / 2, ac = mid + 1, res1, res2;
		if (l != r)
		{
			res1 = check(mid), res2 = check(ac);
			while (res1 == res2 && ac < r)
				res2 = check(++ac);
		}
		else
			res1 = res2 = check(mid);
		ans = max(ans, max(res1, res2));
		if (res1 < res2)
			l = mid + 1;
		else
			r = mid - 1;
	}
	cout << ans;
}

写得比较神奇,但是感觉没什么问题吧,怎么会爆0呢

回复

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

正在加载回复...