关于E
  • 板块学术版
  • 楼主Cute_Fish
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/5 21:43
  • 上次更新2024/10/5 21:45:44
查看原帖
关于E
1121412
Cute_Fish楼主2024/10/5 21:43

RT。

赛时写了个玄学二分+分讨过了。

求分析复杂度,我觉得不对。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int N=207;
int n,m,a[N],p[N],b[N],q[N];
inline bool check(int mn,int x){
	for(int i=1;i<=n;i++){
		int num=0;
		num=ceil(mn*1.0/a[i])*p[i];
		num=min(num,int(ceil(mn*1.0/b[i])*q[i]));
		int sum=0;
		for(int j=1;j*p[i]+j*q[i]<=x&&j*a[i]+j*b[i]<=mn;j++){
			sum=mn-j*a[i]-j*b[i];
			sum=min(int(ceil(sum*1.0/a[i]))*p[i],int(ceil(sum*1.0/b[i]))*q[i]);
			num=min(num,j*p[i]+j*q[i]+sum);
		}
		num=min(int(ceil(mn*1.0/(a[i]*1.0+b[i]*1.0)))*(p[i]+q[i]),num);
		if(num>x)return false;
		x-=num;
	}
	return true;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i]>>p[i]>>b[i]>>q[i];
	int l=0,r=2e9,res=0;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid,m))l=mid+1,res=mid;
		else r=mid-1;
	}
	if(res>=1e9){
		int l=0,r=1e14,res=0;//最大范围
		while(l<=r){
			int mid=(l+r)/2;
			if(check(mid,m))l=mid+1,res=mid;
			else r=mid-1;
		}
		cout<<res<<"\n";
	}else cout<<res;
}
2024/10/5 21:43
加载中...