【题解】P14635 [NOIP2025] 糖果店 / candy
题目传送门
UPD on 2025.12.3:通过了官方数据。
场外选手尝试签到。
考虑买一对的话只会反复买
然后考虑方案数必然是买前
所以先按
注意买完成对的
可以证明,找
注意特判
时间复杂度
代码:
#include<bits/stdc++.h>
#define ll long long
#define back return
#define ri register int
using namespace std;
ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
back x*f;
}
ll n,m,cnt,p,ans,mn=2e18;
struct node
{
ll x,y;
}a[100005];
bool cmp(node a,node b)
{
back a.x<b.x;
}
bool f;
int main()
{
n=read(),m=read();
for(ri i=1;i<=n;i++)
a[i].x=read(),a[i].y=read();
sort(a+1,a+n+1,cmp);
for(ri i=1;i<=n;i++)
if(mn>a[i].x+a[i].y)
mn=min(mn,a[i].x+a[i].y),p=i;
ans=m/mn*2+(m%mn>=a[1].x);
for(ri i=1;i<=n;i++)
{
if(m<a[i].x)
break;
m-=a[i].x,cnt++;
if(i==p)
f=1;
if(f)// p 已经买过一次
ans=max(ans,cnt+m/mn*2+(m%mn>=a[p].y||i+1<=n&&m%mn>=a[i+1].x));
else
ans=max(ans,cnt+m/mn*2+(m%mn>=a[i+1].x));
}
cout<<ans<<"\n";
back 0;
}