题目:
小小闯关
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
yihang_01穿越到了一个闯关游戏中,在这个游戏中总共有n个关卡,每个关卡都有一个防御力为ai和攻击力为bi的门卫,yihang_01具有一个体力值x,每回合yihang_01先进行攻击,攻击力为他当前的体力值x,若x ≥ ai则视为击杀门卫成功,yihang_01吸收当前守卫的防御力化为自身体力,并且进入下一关,否则yihang_01会被门卫反击,体力值减少bi点,进入下一关,当闯关过程中体力 ≤ 0则视为游戏失败,结束游戏
无论是否击败门卫都不影响yihang_01挑战下一关
现在yihang_01并不想打败所有门卫,他想知道最少需要多少最初体力值才能至少打败k个门卫并且能够通关该闯关游戏
即求一个最小的x,使得yihang_01至少能够击败k个守卫并且成功通关游戏
Input
第一行两个整数n, k,分别代表关卡个数以及至少需要打败的门卫数量
第二行为n个整数,a1, a2......an,ai代表第i位门卫的防御力
第三行为n个整数,b1, b2......bn,bi代表第i位门卫的攻击力
1 ≤ k ≤ n ≤ 106, 0 ≤ ai, bi ≤ 109
Output
每个样例输出一个整数x,代表最初体力值最少为x才能使yihang_01至少打败k个守卫并且通关游戏
Examples
input
Copy
10 3 5 2 2 4 5 6 3 8 7 9 1 1 2 3 1 4 2 1 1 5
output
Copy
3
input
Copy
5 1 4 2 1 2 3 1 9 1 5 11
output
Copy
3
Note
在第一个样例中,最小体力值为3
倘若为2,闯完第一关体力值剩余1,闯到第二关时体力值剩余0,闯关失败
体力值为3时,第一关过后体力值剩余2,第二关过后体力值剩余4,此后所有门卫都可以击败
代码:
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e6+9;
int n,k;
int a[N],b[N];
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
int l=0,r=1e16;
while(l<r)
{
int temp=0;
bool flag=1;
int mid=(l+r)/2;
int x=mid;
for(int i=1;i<=n;i++)
{
if(x>=a[i])
{
x+=a[i];
temp++;
}
else if(x<a[i])
{
x-=b[i];
if(x<=0&&i<n)
{
flag=0;
break;
}
}
}
//cout<<mid<<'\n';
if(temp>=k&&flag==1) r=mid;
else l=mid+1;
}
cout<<l<<'\n';
return 0;
}