社区讨论

做法是否正确

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

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@mikdnjn7
此快照首次捕获于
2025/11/29 22:19
3 个月前
此快照最后确认于
2025/12/01 19:45
3 个月前
查看原帖
思路看我邮寄,https://www.luogu.com.cn/article/xgx3ecas
我觉得这个很对啊,但是为啥没人和我做法一样。
codeCPP
#include<bits/stdc++.h>
#define int __int128
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
char buf[1<<23],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
template<typename TP> inline TP read(TP &num)
{
	TP x=0;
	int f=0;
	char ch=getchar();
	while(ch<48||ch>57) f|=ch=='-',ch=getchar();
	while(48<=ch&&ch<=57) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return num=f?-x:x;
}
template<typename ...Args> inline void read(Args &...args)
{
	(read(args),...);
}
template<typename TP> inline void write(TP x)
{
	(x<0)?(putchar('-'),x=-x):0;
	(x>9)?(write(x/10),0):0;
	putchar((x%10)^48);
}
template<typename TP> inline void writeln(TP x)
{
	write<TP>(x);
	puts("");
}
signed main()
{
	int n,m; read(n,m);
	vector<pair<int,int>> cand(n);
	for(auto &[x,y]:cand) read(x,y);
	sort(cand.begin(),cand.end(),[&](auto x,auto y)
	{
		int sx=x.first+x.second,sy=y.first+y.second;
		if(sx!=sy) return sx<sy;
		if(x.first!=y.first) return x.first<y.first;
		return x.second<y.second;
	});
	auto best=cand[0];
	auto eval=[&](int c)->pair<int,int>
	{
		auto [x,y]=best;
		int tot=(x+y)*c;
		if(tot>m) return {-1,-1};
		int mm=m-tot,res=c*2;
		sort(cand.begin(),cand.end());
		for(auto [nx,ny]:cand) if(mm>=nx) mm-=nx,++res;
		return {res,mm};
	};
	int l=0,r=m,ans=-1;
	while(r-l>5)
	{
		int mid1=l+(r-l)/3,mid2=r-(r-l)/3;
		auto v1=eval(mid1),v2=eval(mid2);
		if(v1>=v2) r=mid2,ans=v1.first;
		else l=mid1,ans=v2.first;
	}
	rep(i,l,r) ans=max(ans,eval(i).first);
	writeln(ans);
	return 0;
}

回复

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

正在加载回复...