进行两次二分查找
2024-06-25 20:18:29
发布于:北京
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct produ{
long long cost;
long long contr;
}a[N];
long long n,ans;
long long M;
//函数:当成本为x时,贡献值为多少
long long cacu(long long x)
{
long long sum=0;
for(long long i=1;i<=n;i++)
{
if(x>=a[i].cost)
sum+=(x/a[i].cost)*a[i].contr;
else
sum-=a[i].contr;
}
return sum;
}
bool cmp(produ x,produ y)
{
return x.cost<y.cost;
}
int main()
{
cin>>n>>M;
for(long long i=1;i<=n;i++)
cin>>a[i].cost;
for(long long i=1;i<=n;i++)
cin>>a[i].contr;
sort(a+1,a+n+1,cmp);//按成本从小到大排序 成本尽量小
if(cacu(a[1].cost)>=M)
{
cout<<a[1].cost;
return 0;
}
//不是第一个 二分查找找到第一个贡献值>=M的
long long left=1;
long long right=n;
while(left<=right)
{
long long mid=(left+right)/2;
if(cacu(a[mid].cost)>=M)
{
ans=mid;
right=mid-1;
}
else{
left=mid+1;
}
}
//找到位置了 ans的位置是第一个贡献值满足要求的这个村民的成本 ,拿他和前一个村民的成本 开始精确计算,这两个村民之间定有一个成本是符合条件的最小的。
left=a[ans-1].cost;
right=a[ans].cost;
while(left<=right)
{
long long mid=(left+right)/2;
if(cacu(mid)>=M)
{
ans=mid;
right=mid-1;
}
else{
left=mid+1;
}
}
//一定有结果
cout<<ans;
return 0;
}
全部评论 1
6
2024-10-16 来自 北京
0
有帮助,赞一个