cf B2
  • 板块学术版
  • 楼主JimmyFlower
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/24 01:23
  • 上次更新2024/7/24 09:08:06
查看原帖
cf B2
124676
JimmyFlower楼主2024/7/24 01:23

我没搞明白啊,明明B1过了,为什么B2没有过呢,我觉得是一样的啊

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
using namespace std;
typedef long long ll;
const int N=200010;
int T;
ll n,m,ans;
struct node{ll x,tot;}b[N];
bool operator <(const node &p1,const node &p2){return p1.x<p2.x;}
void solve()
{
	scanf("%lld %lld",&n,&m);
	for(ri i=1;i<=n;i++) scanf("%lld",&b[i].x);
	for(ri i=1;i<=n;i++) scanf("%lld",&b[i].tot);
	sort(b+1,b+n+1);
	ans=0;
	for(ri i=n-1;i>=1;i--)
		if(b[i+1].x-b[i].x==1)
		{
			ll t1=min(m/b[i].x,b[i].tot),t2=min(m/b[i+1].x,b[i+1].tot);//t1=3 t2=4
			if(b[i].x*t1+b[i+1].x*t2<=m) ans=max(ans,b[i].x*t1+b[i+1].x*t2);
			else
			{
				ll x1=m-b[i].x*t1,x2=m-b[i+1].x*t2;
				ans=max(ans,b[i].x*t1+min(x1/b[i+1].x,b[i+1].tot)*b[i+1].x);
				ans=max(ans,b[i+1].x*t2+min(x2/b[i].x,b[i].tot)*b[i].x);
				if(t1)
				ans=max(ans,b[i].x*(t1-1)+min((x1+b[i].x)/b[i+1].x,b[i+1].tot)*b[i+1].x);
				if(t2)
				ans=max(ans,b[i+1].x*(t2-1)+min((x2+b[i+1].x)/b[i].x,b[i].tot)*b[i].x);
			}
		}
	for(ri i=1;i<=n;i++) ans=max(ans,min(m/b[i].x,b[i].tot)*b[i].x);
	printf("%lld\n",ans);
}
int main()
{
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}
2024/7/24 01:23
加载中...