题目描述:你要制作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;
}