思路
二分当前回合数
代码
#include<bits/stdc++.h>
#include<cstring>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<map>
#define int long long
#define lhs printf("\n");
using namespace std;
const int N=2e5+10;
const int M=2024;
const int inf=0x3f3f3f3f;
int n,m,a[N],c[N],t,ans,maxx,flag;
bool check(int x)//计算当前回合数是否可行
{
int sum=0;
for(int i=1;i<=n;i++)
{
int num=(x-1)/c[i];//计算总的伤害
num++;
sum+=(num*a[i]);
}
return (sum>=m) ? 0 : 1;
}
signed main()
{
scanf("%lld",&t);
while(t--)
{
maxx=flag=0;
scanf("%lld%lld",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if(a[i]>=m)//第一回合就可以,可以直接判断掉
{
flag=1;
}
}
for(int i=1;i<=n;i++)scanf("%lld",&c[i]),maxx=max(maxx,c[i]);
if(flag==1)
{
printf("1\n");
continue;
}
int l=1,r=(maxx+3)*m;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
l=mid+1;
}
else
{
r=mid-1;
ans=mid;
}
}
printf("%lld",ans);
lhs
}
return 0;
}