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;
}