题目描述:你要制作n瓶药水,每瓶花费x分钟 现在你有两个优化的方案(给你s个能量)
1 有m个魔法每个魔法花费b[i] 个能量使得制作时间缩短为a[i]
2 有k个魔法 每个魔法花费d[i]个能量,使得c[i]个药水瞬间制作完成(d[i],c[i] 都是从小到大)
这每个方案最多只能选一次
n, m, k (1 ≤ n ≤ 2·10^9, 1 ≤ m, k ≤ 2·10^5) 2 ≤ x ≤ 2·10^9, 1 ≤ s ≤ 2·10^9
分析:因为题目给出了 第二个方案花费和效果都是递增的且只能选一种,那么不妨选取满足条件的最大花费(此时效果最好)所以第一个方案暴力,第二个方案二分查找总共时间复杂度O(n*log(n)) 另外注意下不选的情况
还有这个二分也写了很长一段时间~~~~~ 可以当做二分的模板来用 ,改了后两行就是大于等于了
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long ,long long > P;
P f[200005],s[200005];
long long n,m,k;
long long x,ss;
inline int find(long long key){
long long l=1,r=k;
long long mid=(r+l)>>1;
while(l<r){
if(s[mid].second>key){
r=mid;
}
else l=mid+1;
mid=(l+r)>>1;
}
if(s[r].second<=key) return r;
else return r-1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k;
cin>>x>>ss;
for(int i=1;i<=m;i++) cin>>f[i].first;
for(int i=1;i<=m;i++) cin>>f[i].second;
for(int i=1;i<=k;i++) cin>>s[i].first;
for(int i=1;i<=k;i++) cin>>s[i].second;
long long ans=x*n;
f[0].first=x,f[0].second=0;
s[0].first=0,s[0].second=0;
for(int i=0;i<=m;i++) {
long long second=f[i].first;
long long now=ss-f[i].second;
if(now<0) continue;
int index=find(now);
if(index==0) ans=min(ans,second*n);
ans=min(ans,second*(n-s[index].first));
}
cout<<ans<<endl;
}

京公网安备 11010502036488号