社区讨论

贪心求hack,给出证明过程(但不知是否严谨)

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mik3vl4f
此快照首次捕获于
2025/11/29 17:45
3 个月前
此快照最后确认于
2025/11/30 16:45
3 个月前
查看原帖
该做法通过了考场大样例但是写挂了被一颗都不买的数据干掉了小 M 怎么这么穷
涉及可能的正解故折叠
注意到:购买方式一定为:购买一些种类糖果的第一颗和购买总价最小的一种糖果的若干组,其中总价指购买两颗该种类糖果的价格。
证明:如果购买两种总价不同的糖果各一组,则将其中一组换成总价更低的一组糖果,其价值不变且代价更少。
于是考虑选择哪些糖果只购买一颗,由于所有糖果的价值相同,所以直接排序即可。
CPP
#include<iostream>
#include<algorithm>
using namespace std;

long long n,m,ans;

struct Candy{
	long long x,y;
	bool operator < (const Candy &c) const
	{
		return x < c.x;
	}
}c[100005];

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	long long sum = 0,mn = 0x3f3f3f3f3f3f3f3f;
	for(int i = 1;i <= n;i += 1)
	{
		cin>>c[i].x>>c[i].y;
		mn = min(mn,c[i].x + c[i].y);
	}
	sort(c + 1,c + 1 + n);
	for(int i = 0;i <= n;i += 1)
	{
		sum += c[i].x;
		if(sum > m)
		{
			break;
		}
		ans = max(ans,(m - sum) / mn * 2 + i);
	}
	cout<<ans;
	return 0;
}

回复

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

正在加载回复...