zoukankan      html  css  js  c++  java
  • 【题解】 CF734C Anton and Making Potions

    题意

    要求得到至少 (n) 个药剂,可以使用两种魔法,一种能够缩短制药时间,一种能瞬间制药,

    给你 (x) 表示标准制药一个要 (x) 秒,给你 (s) 表示你的法力值为(s)

    (m) 种第一类魔法,消耗 (b) 点法力值,缩短时间为 (a) 秒。

    (k) 种第二类魔法,消耗 (d) 点法力值,瞬间做出 (c) 个药。

    两种魔法最多各选一个用,问你最少花多少时间能制得至少 (n) 个药剂

    分析:

    1. 首先按第一种药剂以能缩短的时间为第一关键字,以消耗的法力值为第二关键字排序。

    2. 枚举第一种药剂,二分第二种药剂即可。

    Code

    #include <bits/stdc++.h>
    using namespace std;
    
    const int INF= 0x3f3f3f3f;
    const int N=2e5+5;
    typedef long long LL;
    
    LL n,m,k,w,s;
    LL b[N],c[N];
    
    struct Node
    {
    	LL cost;
    	LL changeto;
    } a[N];
    
    int main()
    {
    	scanf("%d%d%d%d%d",&n,&m,&k,&w,&s);
    	for(int i=1; i<=m; i++) scanf("%d",&a[i].cost);
    	for(int i=1; i<=m; i++) scanf("%d",&a[i].changeto);
    	for(int i=1; i<=k; i++) scanf("%d",&b[i]);
    	for(int i=1; i<=k; i++) scanf("%d",&c[i]);
    
    	LL time=n*w;
    	for(int i=1; i<=k; i++)
    	{
    		if(c[i] <= s)
    		{
    			time=min(time, (n-b[i])*w );
    		}
    	}
    	for(int i=1; i<=m; i++)
    	{
    		if(a[i].changeto <= s)
    		{
    			time=min(time, n*a[i].cost );
    		}
    	}
    	for(int i=1; i<=m; i++)
    	{
    		if(a[i].changeto > s) continue;
    
    		LL temp=upper_bound(c+1,c+1+k, s-a[i].changeto )-(c+1);
    		if(c[temp] <= s-a[i].changeto)
    			time=min(time, (n-b[temp])*a[i].cost) ;
    	}
    	
    	cout<<time;
    
    	return 0;
    }
    
  • 相关阅读:
    ASP.NET 设计模式 读书摘记1
    [Exception]Sys.WebForm.PageRequestManagerServerErrorException:500
    [Exception] 当前 TransactionScope 已完成
    [Javascript]客户端检测
    c.Tom and paper
    Currency System in Geraldion (Codeforces 560A)
    巡逻机器人(BFS)
    比赛建金字塔问题解题报告
    除法(暴力)
    比赛找丢失的数解题报告T
  • 原文地址:https://www.cnblogs.com/BorisDimitri/p/15142880.html
Copyright © 2011-2022 走看看