$x,x+1$ 假设 $c$ 个 $x$,$d$ 个 $x+1$,
贪心用 $x$,找到不超过 $m$ 的最大,然后可以类似反悔贪心,用 $x+1$ 替换 $x$ ,这样会多 $1$.
by chen_yy @ 2024-07-24 00:57:40
@[wanttoac](/user/1258100)
by chen_yy @ 2024-07-24 00:57:52
假设当前考虑花瓣数 p ,尽可能的选p,再尽可能的选p+1,此时的收益应当比 m 小一点,这个时候把若干 p 改成 p+1 就可以获得更好的收益,取几个 min 限制一下就行
by Remarks @ 2024-07-24 00:58:33
@[wanttoac](/user/1258100)
可以把每一对差为一的分在一组,然后优先用小的把m填满,如果没填满用大的填。
当m仍没填满,由于两者差为一,只要减少一个小的,添加一个大的,就可以使总量+1。又因为小的都尽量填满了,全部转化为大的就已经是最优的了,因为再添加一个大的一定塞不下。
```cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,now,ans=0;
struct node
{
int a,c;
}s[200005];
bool cmp(node x,node y)
{
return x.a<y.a;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
ans=0;
now=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i].a;
}
for(int i=1;i<=n;i++)
{
cin>>s[i].c;
}
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n-1;i++)
{
if(s[i].a==s[i+1].a)
{
s[i+1].c+=s[i].c;
s[i].a=INT_MAX;
now++;
}
}
sort(s+1,s+n+1,cmp);
n-=now;
s[n+1].a=INT_MAX;
for(int i=1;i<=n;i++)
{
if(s[i].a==s[i+1].a-1)
{
int c1=s[i].c,c2=s[i+1].c,now=0;
if(c1*s[i].a>m)
{
now=(m/s[i].a)*s[i].a;
c1-=(m/s[i].a);
}
else
{
now=c1*s[i].a;
c1=0;
int sum=m-now;
if(c2*s[i+1].a>sum)
{
now+=(sum/s[i+1].a)*s[i+1].a;
c2-=(sum/s[i+1].a);
}
else
{
now+=c2*s[i+1].a;
c2=0;
}
}
ans=max(ans,min(now+min(c2,s[i].c-c1),m));
}
else
{
ans=max(ans,min(s[i].c*s[i].a,(m/s[i].a)*s[i].a));
}
}
cout<<ans<<'\n';
}
return 0;
}
```
by tyr_04 @ 2024-07-24 00:59:10
说的有点抽象,见谅。
by tyr_04 @ 2024-07-24 00:59:43