原题链接:
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 就可以了。