题目来源:https://codeforces.com/contest/1985/problem/F
//
题意:你有n种攻击,每种攻击有周期和攻击力,如果当前回合是x,以为着第i种攻击,下次攻击是x+ci回合。现在有Boss,生命值为h,当h<=0的时候,Boss死亡。一开始所有攻击都没有冷却时间,问最少第几回合Boss死亡。
//
思路:“最开始无脑模拟,tle,这个题和abc的那个周期为5的题很想,但是这个题有n种周期,不是那回事。最后9✌才给我说是二分,我是一点没想到。”二分,二分回合数量,例如mid回合,那么第i种攻击的次数就是((mid-1)/ci)+1,然后*a攻击值,如果总攻击力>mid,r=mid-1,l同理。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int h,n;
cin>>h>>n;
vector<int>a(n+1),c(n+1);
for(int i=1;i<=n;i++){cin>>a[i];}
for(int i=1;i<=n;i++){cin>>c[i];}
int l=1,r=1e12,ans;
while(l<=r){
int mid=(l+r)>>1,sum=0;
for(int i=1;i<=n;i++){
sum+=a[i]*(((mid-1)/c[i])+1);
if(sum>h){break;}
}
if(sum>=h){
r=mid-1;
ans=mid;
}
else{
l=mid+1;
}
}
cout<<ans<<'\n';
}
signed main()
{
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}