How CF B2

学术版

$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


|