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

· · 题解

思路

这道题如果你想到了二分那么你可以尝试将 long long 改为 __int128 试试,我就是这样吃罚时的

如果没有想到二分的话,我们可以从头分析。

代码

#include<bits/stdc++.h>
using namespace std;
__int128 T;
__int128 n,k,t[110],l[110],w[110],p[110];
bool f=0;
inline void read(__int128 &x){
    x=0;char ch;
    bool f=false;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar())
    if (ch=='-')
        f=true;
    for(;ch>='0'&&ch<='9';ch=getchar())
        x=(x<<3)+(x<<1)+(ch&15);
    if (f) x=-x;
}
inline void wr(__int128 x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9) wr(x/10);
    putchar(x%10+'0');
    return ;
}
inline bool check(__int128 x){
    __int128 ans=0;
    for(__int128 i=1;i<=n;i++){
        ans+=(x/p[i])*l[i];
        ans+=(x%p[i]<=t[i]*l[i]?(x%p[i])/t[i]:l[i]);//注意!!! 
    }
    if(ans>=k)return 1;
    else return 0;
}
int main(){
    read(T);
    while(T--){
        read(n),read(k);
        for(__int128 i=1;i<=n;i++)read(t[i]),read(l[i]),read(w[i]),p[i]=t[i]*l[i]+w[i];
        __int128 l=0,r=1e32,mid;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid))r=mid-1;
            else l=mid+1;
        }
        wr(l);
        puts("");
    }
    return 0;
}

之后就会发现你获得了 \textcolor{green}{Accepted}