CodeForces - 734C Anton and Making Potions(二分)

本文详细解析了 CodeForces-734C 题目“Anton and Making Potions”的解决思路。通过讨论四种可能的情况来确定使用不同类型的催化剂以最小化制作药剂所需的时间。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值