原题链接:
思路:
二分答案
代码:
#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 就可以了。
标签:二分,return,int,sum,long,Boss,xmmm,Final From: https://www.cnblogs.com/1747176348mi/p/18652123