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 }

猜你喜欢

转载自www.cnblogs.com/fu3638/p/9104406.html