题意:
你需要制作n瓶药水,每一瓶药水需要花费x秒。
你现在有m种A魔法,花费b[i],使得每一瓶药水的花费代价降为a[i],只能用其中一种。
有K种B魔法,花费d[i],使得瞬间制作好c[i]瓶药水,只能用其中一种。
你最多花费s的魔法值
问你最快完成要多少秒。
题解:
由于魔法B的d[i]和c[i]都是非递减的,所以不会出现消耗魔法值d[i]大而c[i]小的情况,所以直接枚举选择何种A魔法,再二分选择哪种B魔法算答案就好了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;
const int MAXN=2e5+100;
ll a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int main()
{
ll n,x,s;
int m,k;
scanf("%I64d%d%d%I64d%I64d",&n,&m,&k,&x,&s);
rep(i,1,m+1) scanf("%I64d",&a[i]);
rep(i,1,m+1) scanf("%I64d",&b[i]);
rep(i,1,k+1) scanf("%I64d",&c[i]);
rep(i,1,k+1) scanf("%I64d",&d[i]);
ll ans=n*x;
a[0]=x;
for(int i=0;i<=m;i++) //i从0开始!可以不选第一种魔法
{
if(b[i]>s) continue;
int l=0,r=k;
int p=upper_bound(d+1,d+k+1,s-b[i])-d-1;
ans=min(ans,(n-c[p])*a[i]);
}
printf("%I64d\n",ans);
return 0;
}