CodeForces

来源:互联网 发布:三菱plcq系列编程手册 编辑:程序博客网 时间:2024/05/01 17:34

CodeForces - 734C   Anton and Making Potions

题目:有n个药剂需要制作,制作每个药剂需要time秒钟,并且最初有w的能量;魔法师现在有两种催化剂,第一种可以消耗fc[i]

的能量,使得所有药剂的所需时间变为fw[i];第二种消耗能量sc[i],使得sw[i]个数的药剂瞬间制作好;但两种催化剂每种只能最多选

种,问最后最少需要多少时间;


思路:注意到第二种的催化剂消耗的能量与瞬间制作好的药剂都是递增的,分四种情况:1什么药剂也不用  2只用第一种  3只用第二

种 4两个都用这样虽然繁琐了点,但容易理解,前三种情况都好办,对于两个都用的这种情况,因为第二种催化剂的数据是有序

的,我们可以遍历第一种催化剂,然后二分第二种催化剂,有一点需要注意的是,如果对于某一个第一种催化剂,如果二分之后并

没有可用的第二种催化剂,则跳过这次循环,因为这种情况之前已经计算过了

又一次因为一个long long 的类型写成int wa了好几次

#include<stdio.h>#include<algorithm>typedef long long ll;using namespace std;const int MAXN=200010;const ll INF=0x3f3f3f3f3f3f3f3f;ll fw[MAXN],fc[MAXN];ll sw[MAXN],sc[MAXN];int main(void){ll total,f,s;ll time,w;scanf("%lld%lld%lld%lld%lld",&total,&f,&s,&time,&w);ll ans=total*time;for(int i=1;i<=f;i++)   scanf("%lld",&fw[i]);for(int i=1;i<=f;i++)   scanf("%lld",&fc[i]);for(int i=1;i<=s;i++)   scanf("%lld",&sw[i]);for(int i=1;i<=s;i++)   scanf("%lld",&sc[i]); for(int i=1;i<=f;i++){if(fc[i]<=w){   long long temp=total*fw[i];   if(ans>temp) ans=temp;    }} for(int i=1;i<=s;i++){if(sc[i]<=w){   long long temp=(total-sw[i])*time;   if(ans>temp) ans=temp;    }}  for(int i=1;i<=f;i++){bool flag=false;  ll l=1,r=s,a;int p=w-fc[i];if(p<0) continue;while(l<=r){int mid=(l+r)/2;if(sc[mid]<=p) {   a=mid;   flag=true;    l=mid+1;    }else r=mid-1;}    if(!flag) continue;//没有二分到第二种催化剂,跳过这次循环ll t=(total-sw[a])*fw[i];if(ans>t) ans=t;}             printf("%lld\n",ans);return 0;}



原创粉丝点击