Final Boss(二分答案)

原题链接:

Problem - F - Codeforces

思路:

二分答案

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmmm=2e5+10;
int a[xmmm], b[xmmm];
int n, m;
int check(int x){
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=(1+(x-1)/b[i])*a[i];
        if(sum>m)return sum;//之前没加这句话, sum爆long long了;
    }
    return sum;
}
void solve(){
    cin>>m>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    int l=1, r=5e10+10;
    while(l<r){
        int mid=(l+r)/2;
        if(check(mid)<m){
            l=mid+1;
        }
        else r=mid;
    }
    cout<<l<<'\n';
}
signed main()
{
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

总结:

可以很快确定是二分答案

注意边界不要陷入死循环,以及数据范围不要爆longlong 就可以了。

posted @ 2025-01-04 17:07  devoteeing  阅读(33)  评论(0)    收藏  举报