1. 程式人生 > >Codeforces 734C Anton and Making Potions(枚舉+二分)

Codeforces 734C Anton and Making Potions(枚舉+二分)

set making AC 制作 找到 start per ans IV

題目鏈接: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 }

Codeforces 734C Anton and Making Potions(枚舉+二分)