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