Codeforces 734C Anton and Making Potions(枚举+二分)
题目链接:http://codeforces.com/problemset/problem/734/C
题目大意:要制作n个药,初始制作一个药的时间为x,魔力值为s,有两类咒语,
第一类周瑜有m种,每种咒语使制作一个药的时间变成a[i],花费b[i]的魔力,
第二类咒语有k种,每种咒语瞬间产生c[i]个药,花费d[i]的魔力,c[i]和d[i]都是不递减的,
求最短时间内产生n个药的时间。
解题思路:
因为c[i]和d[i]都是不降的,所以可以枚举a[i],然后二分查找花费小于t-b[i]的第二类咒语。
注意这里要用upper_bound()而不能用lower_bound(),比如
10 12
82 82
前者会找到12,而后者会找到10。
代码:
1 #include<bits/stdc++.h> 2 #define lc(a) (a<<1) 3 #define rc(a) (a<<1|1) 4 #define MID(a,b) ((a+b)>>1) 5 #define fin(name) freopen(name,"r",stdin) 6 #define fout(name) freopen(name,"w",stdout) 7 #define clr(arr,val) memset(arr,val,sizeof(arr)) 8 #define _for(i,start,end) for(int i=start;i<=end;i++) 9 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0); 10 using namespace std; 11 typedef long long LL; 12 const int N=2e5+5; 13 const int INF=0x3f3f3f3f; 14 const double eps=1e-10; 15 16 LL n,m,k,x,s; 17 LL a[N],b[N],c[N],d[N]; 18 19 int main(){ 20 FAST_IO; 21 cin>>n>>m>>k>>x>>s; 22 for(int i=1;i<=m;i++){ 23 cin>>a[i]; 24 } 25 for(int i=1;i<=m;i++){ 26 cin>>b[i]; 27 } 28 for(int i=1;i<=k;i++){ 29 cin>>c[i]; 30 } 31 for(int i=1;i<=k;i++){ 32 cin>>d[i]; 33 } 34 35 LL ans=x*n; //初始化为不用魔法所需时间 36 a[0]=x; 37 38 for(int i=0;i<=m;i++){ 39 //魔力值不够 40 if(b[i]>s) continue; 41 LL t=s-b[i]; 42 int pos=upper_bound(d+1,d+1+k,t)-d; 43 pos--; 44 ans=min(ans,a[i]*(n-c[pos])); 45 } 46 cout<<ans<<endl; 47 return 0; 48 }