首页 > 其他分享 >AT_abc374_e [ABC374E] Sensor Optimization Dilemma 2 题解

AT_abc374_e [ABC374E] Sensor Optimization Dilemma 2 题解

时间:2024-10-21 11:24:06浏览次数:1  
标签:Dilemma int 题解 mid max ABC374E 100 0ll check

洛谷题目传送门

AT题目传送门

题目大意:

给定 \(n\) 道工序,你有 \(X\) 元的资金,对于第 \(i\) 道工序,有两种机器供你选择,第一种机器可以花费 \(P_i\) 元处理 \(A_i\) 个产品,第二种机器可以花费 \(Q_i\) 元处理 \(B_i\) 个产品。

钦定第 \(i\) 天处理的产品个数为 \(W_i\),求在总花费不超过 \(X\) 元的前提下,最大化 \(\min_{i=1}^{n} W_i\)。

数据范围:\(1 \leq n,A_i,B_i \leq \color{red}100 \color{black},1 \leq P_i,Q_i,X \leq 10^7\)。

题目分析:

看到这个最大化最小值就想到要使用二分答案了。

check 函数中,我们考虑进行两次 for 循环,第一次循环枚举选第一个机器的个数,从大到小枚举,起始点为 \(\lfloor \frac{mid}{A_i} \rfloor +1\),终止点为 \(\lfloor \frac{mid}{A_i} \rfloor - L\),(这里 \(L\) 先留个悬念后面再提),第二次循环以此类推,每次取费用最小的相加与总花费 \(X\) 比较即可。

check 函数实例:

bool check(int mid)
{
	int sum=0;//本次 check 的总花费
	for(int i=1;i<=n;i++)
	{
		int s=INF;//第 i个工序的最小花费
		//枚举选第一个机器的个数 
		for(int j=mid/a[i]+1;j>=max(mid/a[i]-100,0ll);j--)//下界要与 0 取 max 
		{
			int y=max(0ll,mid-j*a[i]+b[i]-1);
			//这里其实是我懒,不想打 if 判断余数,所以就加了 (b[i]-1),顺便规避了负数会导致计算出错的问题 
			s=min(s,j*p[i]+y/b[i]*q[i]);
		}
		//同理 
		for(int j=mid/b[i]+1;j>=max(mid/b[i]-100,0ll);j--)
		{
			int y=max(0ll,mid-j*b[i]+a[i]-1);
			s=min(s,j*q[i]+y/a[i]*p[i]);
		}
		sum+=s;
	}
	return sum<=x;
}

好了这里上述程序的 \(L\) 取了 \(100\) 左右,原因是 \(A_i,B_i \leq 100\),两种机器都能处理到 \(A_iB_i\),既可以变化的产品最多到 \(\Delta=\operatorname{lcm}(A_i,B_i)\) 即可。

因为对于上述的 check 枚举的是机器个数,故对于第一个机器的下界取到 \(\max(0,\lfloor \frac{mid}{A_i} \rfloor -\frac{\Delta}{A_i})\) 即可,即对于这变化的产品不再使用第一个机器处理,转而使用第二个机器处理,计算花费即可,枚举第二个机器的数量同理。

时间复杂度:\(O(L \log V)\),其中 \(L \approx A_i+B_i \leq 200,V=10^9\),\(V\) 为二分答案的值域。

Code:

赛时代码写得有点丑

标签:Dilemma,int,题解,mid,max,ABC374E,100,0ll,check
From: https://www.cnblogs.com/lunjiahao/p/18489086

相关文章

  • UVA11294 Wedding 题解
    洛谷题目传送门前排提示:本题需要用到知识点2-SAT以及强联通分量,模板传送门P4782【模板】2-SAT。题目大意:有至多\(30\)对夫妻将会参加一个婚宴。他们将会坐在一个长桌子的两边。新郎新娘坐在彼此相对的一端并且新娘带着一个头饰使得她看不到和她坐在同一边的人。夫妻坐在......
  • SP9685 ZTC - Zombie’s Treasure Chest 题解
    洛谷题目传送门双倍经验简单题。对于空间大小为\(s1\timess2\)时,显然最多可得到的价值为\(\max(s2\timesv1,s1\timesv2)\),剩下小于\(s1\timess2\)的部分选一个占用空间大的枚举就好。时间复杂度:\(O(T\lfloor\frac{m}{\max(s1,s2)}\rfloor)\),其中\(m=n\bmo......
  • 【题解】Solution Set - NOIP2024集训Day57 字符串
    【题解】SolutionSet-NOIP2024集训Day57字符串https://www.becoder.com.cn/contest/5653「CF213E」TwoPermutations「CF961F」k-substrings「CF580E」KefaandWatch「CF504E」MishaandLCPonTree......
  • Codeforces Round 979 div2 个人题解(A~E)
    CodeforcesRound979div2个人题解(A~E)Dashboard-CodeforcesRound979(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cmath>#include<cstdio>#inc......
  • P11211 随机数生成器 题解
    前置知识:原根,exCRT。首先\(t=1\)是容易的,直接相邻的除一下即可。否则考虑询问除连续的\(5\)个数,分别为\(a_0,a_1,\cdots,a_4\)。首先特判掉存在\(a_i=0\)的情况,此时直接枚举\(s\)即可。我们先求出\(p\)的一个原根\(g\),设离散对数\(\log(x)=y\)表示\(g^y\equiv......
  • 牛客周赛Round64-B题题解
    牛客周赛Round64-B题题解题目描述:小红拿到了一个正整数,请你帮小红将其表示为幂(a^b)的形式。输入描述:一个正整数2<=x<=10^5输出描述:`第一行输出x。接下来每一行输出一个幂的表达式。请按指数从小到大的顺序输出。示例1输入16输出16=16^1=4^2=2^4解题思路:......
  • 【秋招笔试-支持在线评测】10.19京东秋招(已改编)-三语言题解
    ......
  • 【秋招笔试-支持在线评测】10.19小米秋招(已改编)-研发岗题解
    ......
  • [20241024] T3 题解
    细节挺多的。题意有一个长度为\(n\)的数组\(a\)和一个长度为\(m\)的队列\(q\),初始时\(q\)中的元素和为\(0\)。对\(x=1,2,\cdots,n\)进行如下操作:如果队首元素\(q_1<a_x\),则\(q\)弹出队首,将\(a_x\)插入队尾。在操作结束后,定义数组\(a\)的权值为\(q\)......
  • 2024 ICPC Asia Taiwan Online Programming Contest题解记录
    比赛链接:https://codeforces.com/gym/105383/problemA.AnimalFarm找个最大pig,然后所有比他小的其他种类生物一直加就好了#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllmod=1e9+7;llksm(llx,lly){ llans=1; while(y) { if(y&1)......