专栏文章

题解:P14237 [CCPC 2024 Shandong I] 打印机

P14237题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minks3vg
此快照首次捕获于
2025/12/02 04:01
3 个月前
此快照最后确认于
2025/12/02 04:01
3 个月前
查看原文

题目大意

nn 台打印机,第 ii 台打印机每 tit_i 秒打印一份试题,但每次打印 lil_i 份试题后要休息 wiw_i 秒。 如果所有打印机同时工作,打印 kk 份题至少要多久。
n100,ti,li,wi,k109n ≤ 100,t_i, l_i,w_i, k ≤ 109

思路

  • 二分答案 xx,计算每台打印机在 xx 秒内能打印多少试题。
  • 看加起来是否大于等于 kk。最差情况下,k=ti=wi=109li=1k = t_i = w_i = 109,l_i = 1,所以二分上界是2×10182 × 1018
  • 然而 x=2×1018x = 2 × 1018 时,如果打印机每 1 秒打印一份题。
  • n=100n = 100 台打印机一共可以打印 2×10202 × 1020 份,超出了 longlonglong long 的上界。所以二分过程需要判断和已经大于 k 时提前 返回 truetrue

AC code

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,t[100005],pi[100005],li[100005],w[100005];
bool ck(int x)
{
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int op=x/((t[i]*li[i])+w[i]);
        int res=x-(op*((t[i]*li[i])+w[i]));
        if(res/t[i]>li[i])
            ans+=op*li[i]+li[i];
        else
			ans+=(op*li[i])+res/t[i];
    	if(ans>=k)
			return 1;
	}
	return (ans>=k);
}
void so()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>t[i]>>li[i]>>w[i],pi[i]=t[i]*li[i]+w[i];
	int l=0,r=LLONG_MAX,ans=0;
	while(l<=r)
	{
		int M=(l+r)/2;
		if(ck(M))
		{
			ans=M;
			r=M-1;
		}
		else
			l=M+1;
	}
	cout<<ans<<endl;
}
signed main()
{
	int T;
	cin>>T;
	while(T--)
	{
		so();
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...